Skip to content

Commit 176137b

Browse files
author
sebuntin
committed
ohos: Enhance AdaptiveCanvas with drawParagraph method and improve native canvas proxy resource management
1 parent 11141c7 commit 176137b

File tree

41 files changed

+402
-228
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+402
-228
lines changed

compose/common/src/androidMain/kotlin/androidx/compose/common/interop/LogPrintUtil.android.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ actual object LogPrintUtil {
2424
actual fun verbose(message: String) {
2525
println(message)
2626
}
27+
28+
actual var isLogEnabled: Boolean
29+
get() = TODO("Not yet implemented")
30+
set(value) {}
2731
}

compose/common/src/commonMain/kotlin/androidx/compose/common/interop/LogPrintUtil.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ interface LogPrintInterface {
2222

2323
expect object LogPrintUtil {
2424
var logPrintImpl: LogPrintInterface?
25+
var isLogEnabled: Boolean
2526
fun verbose(message: String)
2627
}

compose/common/src/ohosArm64Main/kotlin/androidx/compose/common/interop/LogPrintUtil.ohosArm64.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import platform.ohos.LOG_DEBUG
2121
import platform.ohos.OH_LOG_Print
2222

2323
actual object LogPrintUtil {
24+
private var _isLogEnabled: Boolean = true
2425

2526
private val DefaultLogger = object : LogPrintInterface {
2627
override fun verbose(message: String) {
@@ -36,6 +37,14 @@ actual object LogPrintUtil {
3637
actual var logPrintImpl: LogPrintInterface? = DefaultLogger
3738

3839
actual fun verbose(message: String) {
39-
this.logPrintImpl?.verbose(message)
40+
if (isLogEnabled) {
41+
this.logPrintImpl?.verbose(message)
42+
}
4043
}
44+
45+
actual var isLogEnabled: Boolean
46+
get() = _isLogEnabled
47+
set(value) {
48+
_isLogEnabled = value
49+
}
4150
}

compose/common/src/uikitMain/kotlin/androidx/compose/common/interop/LogPrintUtil.darwin.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package androidx.compose.common.interop
1919
import platform.Foundation.NSLog
2020

2121
actual object LogPrintUtil {
22+
private var _isLogEnabled: Boolean = false
2223
private val DefaultLogger = object : LogPrintInterface {
2324
override fun verbose(message: String) {
2425
NSLog(message)
@@ -28,6 +29,14 @@ actual object LogPrintUtil {
2829
actual var logPrintImpl: LogPrintInterface? = DefaultLogger
2930

3031
actual fun verbose(message: String) {
31-
this.logPrintImpl?.verbose("[shiqi]${message}")
32+
if (isLogEnabled) {
33+
this.logPrintImpl?.verbose("[shiqi]${message}")
34+
}
3235
}
36+
37+
actual var isLogEnabled: Boolean
38+
get() = _isLogEnabled
39+
set(value) {
40+
_isLogEnabled = value
41+
}
3342
}

compose/ui/ui-arkui/src/ohosArm64Main/cpp/compose/src/main/cpp/compose/canvas/oh_native_canvas_export.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
* limitations under the License.
1616
*/
1717

18-
#include "napi/native_api.h"
18+
#include <napi/native_api.h>
19+
#include "../constants/oh_native_constants.h"
1920
#include "../xcomponent_log.h"
2021
#include "oh_native_canvas_export.h"
2122
#include "oh_native_canvas_proxy.h"
@@ -37,9 +38,23 @@ OHNativeCanvasProxy_Handle androidx_compose_ui_arkui_utils_createOHNativeCanvasP
3738
LOGI("androidx_compose_ui_arkui_utils_createOHNativeCanvasProxy");
3839
}
3940

41+
void androidx_compose_ui_arkui_utils_DisposeOHNativeCanvasProxy(OHNativeCanvasProxy_Handle proxyHandle) {
42+
auto canvasProxy = reinterpret_cast<androidx::compose::ui::arkui::utils::OHNativeCanvasProxy *>(proxyHandle);
43+
LOGI("androidx_compose_ui_arkui_utils_DisposeOHNativeCanvasProxy %{public}p", canvasProxy);
44+
// delete canvasProxy here to avoid memory leak
45+
delete canvasProxy;
46+
};
47+
48+
void androidx_compose_ui_arkui_utils_DisposeOHComposeNativePaint(OHComposeNativePaint_Handle paintHandle) {
49+
auto paint = reinterpret_cast<androidx::compose::ui::arkui::utils::OHComposeNativePaint *>(paintHandle);
50+
LOGI("androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_DisposeOHComposeNativePaint %{public}p", paint);
51+
// delete paint here to avoid memory leak
52+
delete paint;
53+
};
54+
4055
/// OHNativeCanvasProxy drawing methods
41-
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_beginDraw(OHNativeCanvasProxy_Handle proxy) {
42-
auto canvasProxy = reinterpret_cast<androidx::compose::ui::arkui::utils::OHNativeCanvasProxy *>(proxy);
56+
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_beginDraw(OHNativeCanvasProxy_Handle proxyHandle) {
57+
auto canvasProxy = reinterpret_cast<androidx::compose::ui::arkui::utils::OHNativeCanvasProxy *>(proxyHandle);
4358
canvasProxy->beginDraw();
4459
LOGI("androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_beginDraw");
4560
}
@@ -78,6 +93,18 @@ void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawLayer(OHNativeCanva
7893
LOGI("androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawLayer");
7994
}
8095

96+
97+
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawParagraph(OHNativeCanvasProxy_Handle proxy, BaseRenderNode_Handle paragraphHandle) {
98+
auto paragraph = reinterpret_cast<OH::BaseRenderNode *>(paragraphHandle);
99+
auto canvasProxy = reinterpret_cast<androidx::compose::ui::arkui::utils::OHNativeCanvasProxy *>(proxy);
100+
if (paragraph->getType() != OH_DrawingNode_Type::ParagraphNode) {
101+
LOGE("androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawParagraph: invalid paragraph node type");
102+
throw std::invalid_argument("Invalid paragraph node type");
103+
}
104+
canvasProxy->drawParagraph(dynamic_cast<OH::Paragraph*>(paragraph));
105+
LOGI("androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawParagraph");
106+
}
107+
81108
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_attachToRootView(OHNativeCanvasProxy_Handle proxy) {
82109
auto canvasProxy = reinterpret_cast<androidx::compose::ui::arkui::utils::OHNativeCanvasProxy *>(proxy);
83110
canvasProxy->attachToRootView();

compose/ui/ui-arkui/src/ohosArm64Main/cpp/compose/src/main/cpp/compose/canvas/oh_native_canvas_export.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626

2727
EXTERN_C_START
2828
OHNativeCanvasProxy_Handle androidx_compose_ui_arkui_utils_createOHNativeCanvasProxy(void *factory);
29-
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_beginDraw(OHNativeCanvasProxy_Handle proxy);
29+
void androidx_compose_ui_arkui_utils_DisposeOHNativeCanvasProxy(OHNativeCanvasProxy_Handle proxyHandle);
30+
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_beginDraw(OHNativeCanvasProxy_Handle proxyHandle);
3031
OHComposeNativePaint_Handle androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_Paint(OHNativeCanvasProxy_Handle proxy);
32+
void androidx_compose_ui_arkui_utils_DisposeOHComposeNativePaint(OHComposeNativePaint_Handle paintHandle);
3133

3234
// OHNativeCanvasProxy state operations
3335
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_save(OHNativeCanvasProxy_Handle proxy);
@@ -42,6 +44,7 @@ void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_setOpacity(OHNativeCanv
4244
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawRect(OHNativeCanvasProxy_Handle proxy, float left, float top, float right, float bottom, OHComposeNativePaint_Handle paint);
4345
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_finishDraw(OHNativeCanvasProxy_Handle proxy);
4446
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawLayer(OHNativeCanvasProxy_Handle proxy, BaseRenderNode_Handle renderNodeHandle);
47+
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawParagraph(OHNativeCanvasProxy_Handle proxy, BaseRenderNode_Handle paragraphHandle);
4548
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_attachToRootView(OHNativeCanvasProxy_Handle proxy);
4649
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_setParent(OHNativeCanvasProxy_Handle proxy, OHNativeCanvasProxy_Handle parentProxy);
4750
void androidx_compose_ui_arkui_utils_OHNativeCanvasProxy_drawLine(OHNativeCanvasProxy_Handle proxy, float x1, float y1, float x2, float y2, OHComposeNativePaint_Handle paint);

compose/ui/ui-arkui/src/ohosArm64Main/cpp/compose/src/main/cpp/compose/canvas/oh_native_canvas_layer_drawer.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,15 @@ void OHRenderNodeDrawText(const RenderNodeSaveState *saveState, Paragraph *parag
120120
const float originY = saveState->translateY;
121121
const int32_t width = paragraphNode->getWidth();
122122
const int32_t height = paragraphNode->getHeight();
123+
// LOGI("Transform matrix: %{public}s", saveState->transform.toReadableString().c_str());
124+
123125
paragraphNode->setTransform(saveState->transform.data())
124-
->setTranslate(saveState->translateX, saveState->translateY)
125-
->setPosition(originX, originY)
126+
->setTranslate(originX, originY)
127+
->setPosition(originX, originY)
126128
->setSize(width, height);
127-
LOGI("OHRenderNodeDrawText: start drawing paragraph, setTranslate: %{public}f, %{public}f, setSize: "
128-
"%{public}d, %{public}d",
129+
130+
LOGI("OHRenderNodeDrawText: start drawing paragraph, translateX/Y: %{public}f, %{public}f, "
131+
"position: 0, 0, size: %{public}d, %{public}d, transform applied",
129132
originX, originY, width, height);
130133
paragraphNode->paint(0, 0);
131134
}

compose/ui/ui-arkui/src/ohosArm64Main/cpp/compose/src/main/cpp/compose/canvas/oh_native_canvas_proxy.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ void OHNativeCanvasProxy::translate(float dx, float dy) { _pictureRecorder.trans
106106
void OHNativeCanvasProxy::drawLayerWithSubproxy(OHNativeCanvasProxy *subproxy) {
107107
LOGI("OHNativeCanvasProxy::drawLayerWithSubproxy: start");
108108
if (subproxy->canvasNode_ != nullptr) {
109-
_pictureRecorder.drawRenderNode(subproxy->canvasNode_.get());
109+
auto canvasNode = subproxy->canvasNode_.get();
110+
_pictureRecorder.drawRenderNode(canvasNode, canvasNode->getType());
110111
}
111112
}
112113

@@ -181,14 +182,18 @@ void OHNativeCanvasProxy::drawLine(float x1, float y1, float x2, float y2, OHCom
181182
_pictureRecorder.getOrCreateRenderNodeForDrawing(updateItem.drawingType, updateItem.itemHash);
182183
OH::OHRenderNodeDrawLine(x1, y1, x2, y2, paint->shader, &(updateItem.saveState), renderNodeForDrawing, paint);
183184
}
184-
}
185+
};
185186

186187
void OHNativeCanvasProxy::drawLayer(OH::BaseRenderNode *renderNode) {
187-
OH::PictureRecorderUpdateInfo updateItem = _pictureRecorder.drawRenderNode(renderNode);
188-
// TODO:ios上传入了CALayer,oh需要对应的renderNode?
189-
if (typeid(*renderNode) == typeid(OH::Paragraph)) {
190-
OH::OHRenderNodeDrawText(&(updateItem.saveState), (OH::Paragraph *)renderNode);
191-
LOGI("OHRenderNodeDrawText, paragraphNode hash: %{public}lu", updateItem.itemHash);
188+
OH::PictureRecorderUpdateInfo updateItem = _pictureRecorder.drawRenderNode(renderNode, renderNode->getType());
189+
};
190+
191+
void OHNativeCanvasProxy::drawParagraph(OH::Paragraph *paragraph) {
192+
LOGI("OHNativeCanvasProxy::drawParagraph: start %{public}f", paragraph->getHeight());
193+
OH::PictureRecorderUpdateInfo updateItem = _pictureRecorder.drawRenderNode(paragraph, paragraph->getType());
194+
bool isDirty = updateItem.isDirty;
195+
if (isDirty) {
196+
OH::OHRenderNodeDrawText(&(updateItem.saveState), paragraph);
192197
}
193198
};
194199

compose/ui/ui-arkui/src/ohosArm64Main/cpp/compose/src/main/cpp/compose/canvas/oh_native_canvas_proxy.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef ANDROIDX_COMPOSE_UI_ARKUI_UTILS_OHNATIVECANVASPROXY_H
22
#define ANDROIDX_COMPOSE_UI_ARKUI_UTILS_OHNATIVECANVASPROXY_H
33

4-
#include "arkui/native_render.h"
4+
#include "../paragraph/oh_native_paragraph_builder.h"
55
#include "oh_compose_native_paint.h"
66
#include "../render_node/oh_base_render_node.h"
77
#include "../picture_recorder/oh_native_picture_recorder.h"
@@ -13,7 +13,6 @@ class OHNativeCanvasProxy {
1313
explicit OHNativeCanvasProxy(OH::BaseRenderNode *rootNode);
1414
~OHNativeCanvasProxy();
1515
OHComposeNativePaint* Paint();
16-
void BeginDraw();
1716
OH::BaseRenderNode* getRenderNode();
1817
void beginDraw();
1918
void attachToRootView();
@@ -31,6 +30,7 @@ class OHNativeCanvasProxy {
3130
void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, OHComposeNativePaint* paint);
3231
void drawLine(float x1, float y1, float x2, float y2, OHComposeNativePaint* paint);
3332
void drawLayer(OH::BaseRenderNode* renderNode);
33+
void drawParagraph(OH::Paragraph* paragraph);
3434
void clipRect(float left, float top, float right, float bottom, OH_Native_Draw_ClipOp clipOp);
3535
void drawLayerWithSubproxy(OHNativeCanvasProxy *subProxy);
3636
private:

compose/ui/ui-arkui/src/ohosArm64Main/cpp/compose/src/main/cpp/compose/constants/oh_native_enums.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,39 @@ typedef enum {
6666
DrawingTypeShaderRowPoints,
6767
DrawingTypeRowVertices,
6868
DrawingTypeShaderRowVertices,
69+
DrawingTypeDrawTextLayer,
6970
DrawingTypeDrawLayer,
7071
DrawingTypeSave,
7172
DrawingTypeRestore,
7273
DrawingTypeClip,
7374
DrawingTypePop
7475
} OH_Native_Drawing_Type;
7576

77+
typedef enum {
78+
BaseNode,
79+
LineNode,
80+
ParagraphNode,
81+
LineGradientNode,
82+
RectGradientNode
83+
// TODO: 每实现一个BaseRenderNode的派生类,就需要在此处添加对应的枚举值
84+
} OH_DrawingNode_Type;
85+
7686
// Enum to specify the type of RenderNode save state
7787
typedef enum {
7888
SafeGuard, // Safe guard
7989
Save, // Pure save operation
8090
Clip // Clip operation
8191
} OH_RenderNode_SaveState_MakeType;
8292

93+
typedef enum {
94+
NoneTypeShader,
95+
LinearGradientShader,
96+
RadialGradientShader,
97+
SweepGradientShader,
98+
ImageShader
99+
// TODO: 每实现一个BasicShader的派生类,就需要在此处添加对应的枚举值
100+
} OH_Native_Shader_Type;
101+
83102
typedef enum {
84103
PathOpDifference,
85104
PathOpIntersect,

0 commit comments

Comments
 (0)