• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "drag_window_ohos.h"
17 
18 #include "txt/paragraph_txt.h"
19 
20 #ifdef NEW_SKIA
21 #include "include/core/SkCanvas.h"
22 #include "include/core/SkSamplingOptions.h"
23 #endif
24 
25 #include "base/geometry/ng/rect_t.h"
26 #include "base/geometry/offset.h"
27 #include "base/image/pixel_map.h"
28 #include "base/log/log_wrapper.h"
29 #include "base/utils/utils.h"
30 #include "core/components/text/render_text.h"
31 #include "core/components_ng/base/frame_node.h"
32 #include "core/components_ng/pattern/text/text_pattern.h"
33 #include "core/components_ng/render/adapter/rosen_render_context.h"
34 #ifndef USE_ROSEN_DRAWING
35 #include "core/components_ng/render/adapter/skia_image.h"
36 #else
37 #include "core/components_ng/render/adapter/rosen/drawing_image.h"
38 #include "core/components_ng/render/drawing.h"
39 #endif
40 #include "core/pipeline_ng/pipeline_context.h"
41 
42 #ifdef USE_ROSEN_DRAWING
43 using namespace OHOS::Rosen;
44 #endif
45 
46 namespace OHOS::Ace {
47 #ifdef ENABLE_ROSEN_BACKEND
48 namespace {
49 // Adapt text dragging background shadows to expand the width of dargwindow
50 const Dimension Window_EXTERN = 10.0_vp;
51 #ifndef USE_ROSEN_DRAWING
ColorSpaceToSkColorSpace(const RefPtr<PixelMap> & pixmap)52 sk_sp<SkColorSpace> ColorSpaceToSkColorSpace(const RefPtr<PixelMap>& pixmap)
53 {
54     return SkColorSpace::MakeSRGB(); // Media::PixelMap has not support wide gamut yet.
55 }
56 #endif
57 
58 #ifndef USE_ROSEN_DRAWING
AlphaTypeToSkAlphaType(const RefPtr<PixelMap> & pixmap)59 SkAlphaType AlphaTypeToSkAlphaType(const RefPtr<PixelMap>& pixmap)
60 {
61     switch (pixmap->GetAlphaType()) {
62         case AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN:
63             return SkAlphaType::kUnknown_SkAlphaType;
64         case AlphaType::IMAGE_ALPHA_TYPE_OPAQUE:
65             return SkAlphaType::kOpaque_SkAlphaType;
66         case AlphaType::IMAGE_ALPHA_TYPE_PREMUL:
67             return SkAlphaType::kPremul_SkAlphaType;
68         case AlphaType::IMAGE_ALPHA_TYPE_UNPREMUL:
69             return SkAlphaType::kUnpremul_SkAlphaType;
70         default:
71             return SkAlphaType::kUnknown_SkAlphaType;
72     }
73 }
74 #else
AlphaTypeToAlphaType(const RefPtr<PixelMap> & pixmap)75 RSAlphaType AlphaTypeToAlphaType(const RefPtr<PixelMap>& pixmap)
76 {
77     switch (pixmap->GetAlphaType()) {
78         case AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN:
79             return RSAlphaType::ALPHATYPE_UNKNOWN;
80         case AlphaType::IMAGE_ALPHA_TYPE_OPAQUE:
81             return RSAlphaType::ALPHATYPE_OPAQUE;
82         case AlphaType::IMAGE_ALPHA_TYPE_PREMUL:
83             return RSAlphaType::ALPHATYPE_PREMUL;
84         case AlphaType::IMAGE_ALPHA_TYPE_UNPREMUL:
85             return RSAlphaType::ALPHATYPE_UNPREMUL;
86         default:
87             return RSAlphaType::ALPHATYPE_UNKNOWN;
88     }
89 }
90 #endif
91 
92 #ifndef USE_ROSEN_DRAWING
PixelFormatToSkColorType(const RefPtr<PixelMap> & pixmap)93 SkColorType PixelFormatToSkColorType(const RefPtr<PixelMap>& pixmap)
94 {
95     switch (pixmap->GetPixelFormat()) {
96         case PixelFormat::RGB_565:
97             return SkColorType::kRGB_565_SkColorType;
98         case PixelFormat::RGBA_8888:
99             return SkColorType::kRGBA_8888_SkColorType;
100         case PixelFormat::BGRA_8888:
101             return SkColorType::kBGRA_8888_SkColorType;
102         case PixelFormat::ALPHA_8:
103             return SkColorType::kAlpha_8_SkColorType;
104         case PixelFormat::RGBA_F16:
105             return SkColorType::kRGBA_F16_SkColorType;
106         case PixelFormat::UNKNOWN:
107         case PixelFormat::ARGB_8888:
108         case PixelFormat::RGB_888:
109         case PixelFormat::NV21:
110         case PixelFormat::NV12:
111         case PixelFormat::CMYK:
112         default:
113             return SkColorType::kUnknown_SkColorType;
114     }
115 }
116 #else
PixelFormatToColorType(const RefPtr<PixelMap> & pixmap)117 RSColorType PixelFormatToColorType(const RefPtr<PixelMap>& pixmap)
118 {
119     switch (pixmap->GetPixelFormat()) {
120         case PixelFormat::RGB_565:
121             return RSColorType::COLORTYPE_RGB_565;
122         case PixelFormat::RGBA_8888:
123             return RSColorType::COLORTYPE_RGBA_8888;
124         case PixelFormat::BGRA_8888:
125             return RSColorType::COLORTYPE_BGRA_8888;
126         case PixelFormat::ALPHA_8:
127             return RSColorType::COLORTYPE_ALPHA_8;
128         case PixelFormat::RGBA_F16:
129         case PixelFormat::UNKNOWN:
130         case PixelFormat::ARGB_8888:
131         case PixelFormat::RGB_888:
132         case PixelFormat::NV21:
133         case PixelFormat::NV12:
134         case PixelFormat::CMYK:
135         default:
136             return RSColorType::COLORTYPE_UNKNOWN;
137     }
138 }
139 #endif
140 
141 #ifndef USE_ROSEN_DRAWING
MakeSkImageInfoFromPixelMap(const RefPtr<PixelMap> & pixmap)142 SkImageInfo MakeSkImageInfoFromPixelMap(const RefPtr<PixelMap>& pixmap)
143 {
144     SkColorType colorType = PixelFormatToSkColorType(pixmap);
145     SkAlphaType alphaType = AlphaTypeToSkAlphaType(pixmap);
146     sk_sp<SkColorSpace> colorSpace = ColorSpaceToSkColorSpace(pixmap);
147     return SkImageInfo::Make(pixmap->GetWidth(), pixmap->GetHeight(), colorType, alphaType, colorSpace);
148 }
149 #else
MakeBitmapFormatFromPixelMap(const RefPtr<PixelMap> & pixmap)150 RSBitmapFormat MakeBitmapFormatFromPixelMap(const RefPtr<PixelMap>& pixmap)
151 {
152     RSBitmapFormat format;
153     format.colorType = PixelFormatToColorType(pixmap);
154     format.alphaType = AlphaTypeToAlphaType(pixmap);
155     return format;
156 }
157 #endif
158 
159 #ifndef USE_ROSEN_DRAWING
DrawSkImage(SkCanvas * canvas,const sk_sp<SkImage> & skImage,int32_t width,int32_t height)160 void DrawSkImage(SkCanvas* canvas, const sk_sp<SkImage>& skImage, int32_t width, int32_t height)
161 {
162     CHECK_NULL_VOID(skImage);
163     SkPaint paint;
164     sk_sp<SkColorSpace> colorSpace = skImage->refColorSpace();
165 #ifdef USE_SYSTEM_SKIA
166     paint.setColor4f(paint.getColor4f(), colorSpace.get());
167 #else
168     paint.setColor(paint.getColor4f(), colorSpace.get());
169 #endif
170     auto skSrcRect = SkRect::MakeXYWH(0, 0, skImage->width(), skImage->height());
171     auto skDstRect = SkRect::MakeXYWH(0, 0, width, height);
172 #ifndef NEW_SKIA
173     canvas->drawImageRect(skImage, skSrcRect, skDstRect, &paint);
174 #else
175     canvas->drawImageRect(
176         skImage, skSrcRect, skDstRect, SkSamplingOptions(), &paint, SkCanvas::kFast_SrcRectConstraint);
177 #endif
178 }
179 #else
DrawDrawingImage(RSCanvas * canvas,const std::shared_ptr<RSImage> & drawingImage,int32_t width,int32_t height)180 void DrawDrawingImage(RSCanvas* canvas, const std::shared_ptr<RSImage>& drawingImage, int32_t width, int32_t height)
181 {
182     CHECK_NULL_VOID(drawingImage);
183     RSBrush brush;
184     auto colorSpace = RSRecordingColorSpace::CreateRefImage(*drawingImage);
185     brush.SetColor(brush.GetColor4f(), colorSpace);
186     auto srcRect = RSRect(0, 0, drawingImage->GetWidth(), drawingImage->GetHeight());
187     auto dstRect = RSRect(0, 0, width, height);
188     RSSamplingOptions sampling;
189     canvas->AttachBrush(brush);
190     canvas->DrawImageRect(*drawingImage, srcRect, dstRect, sampling);
191     canvas->DetachBrush();
192 }
193 #endif
194 
195 #ifndef USE_ROSEN_DRAWING
DrawPixelMapInner(SkCanvas * canvas,const RefPtr<PixelMap> & pixmap,int32_t width,int32_t height)196 void DrawPixelMapInner(SkCanvas* canvas, const RefPtr<PixelMap>& pixmap, int32_t width, int32_t height)
197 {
198     // Step1: Create SkPixmap
199     auto imageInfo = MakeSkImageInfoFromPixelMap(pixmap);
200     SkPixmap imagePixmap(imageInfo, reinterpret_cast<const void*>(pixmap->GetPixels()), pixmap->GetRowBytes());
201 
202     // Step2: Create SkImage and draw it
203     sk_sp<SkImage> skImage =
204         SkImage::MakeFromRaster(imagePixmap, &PixelMap::ReleaseProc, PixelMap::GetReleaseContext(pixmap));
205     DrawSkImage(canvas, skImage, width, height);
206 }
207 #else
DrawPixelMapInner(RSCanvas * canvas,const RefPtr<PixelMap> & pixmap,int32_t width,int32_t height)208 void DrawPixelMapInner(RSCanvas* canvas, const RefPtr<PixelMap>& pixmap, int32_t width, int32_t height)
209 {
210     // Step1: Create Bitmap
211     auto bitmapFormat = MakeBitmapFormatFromPixelMap(pixmap);
212     auto bitmap = std::make_shared<RSBitmap>();
213     bitmap->Build(pixmap->GetWidth(), pixmap->GetHeight(), bitmapFormat);
214     bitmap->SetPixels(const_cast<void*>(reinterpret_cast<const void*>(pixmap->GetPixels())));
215 
216     // Step2: Create Image and draw it
217     auto image = std::make_shared<RSImage>();
218     image->BuildFromBitmap(*bitmap);
219     DrawDrawingImage(canvas, image, width, height);
220 }
221 #endif
222 } // namespace
223 #endif
224 
CreateDragWindow(const std::string & windowName,int32_t x,int32_t y,uint32_t width,uint32_t height)225 RefPtr<DragWindow> DragWindow::CreateDragWindow(
226     const std::string& windowName, int32_t x, int32_t y, uint32_t width, uint32_t height)
227 {
228     int32_t halfWidth = static_cast<int32_t>(width) / 2;
229     int32_t halfHeight = static_cast<int32_t>(height) / 2;
230 
231     OHOS::sptr<OHOS::Rosen::WindowOption> option = new OHOS::Rosen::WindowOption();
232     option->SetWindowRect({ x - halfWidth, y - halfHeight, width, height });
233     option->SetHitOffset(halfWidth, halfHeight);
234     option->SetWindowType(OHOS::Rosen::WindowType::WINDOW_TYPE_DRAGGING_EFFECT);
235     option->SetWindowMode(OHOS::Rosen::WindowMode::WINDOW_MODE_FLOATING);
236     option->SetFocusable(false);
237     OHOS::sptr<OHOS::Rosen::Window> dragWindow = OHOS::Rosen::Window::Create(windowName, option);
238     CHECK_NULL_RETURN(dragWindow, nullptr);
239 
240     OHOS::Rosen::WMError ret = dragWindow->Show();
241     if (ret != OHOS::Rosen::WMError::WM_OK) {
242         LOGE("DragWindow::CreateDragWindow, drag window Show() failed, ret: %d", ret);
243     }
244 
245     auto window = AceType::MakeRefPtr<DragWindowOhos>(dragWindow);
246     window->SetSize(width, height);
247     return window;
248 }
249 
CreateTextDragWindow(const std::string & windowName,int32_t x,int32_t y,uint32_t width,uint32_t height)250 RefPtr<DragWindow> DragWindow::CreateTextDragWindow(
251     const std::string& windowName, int32_t x, int32_t y, uint32_t width, uint32_t height)
252 {
253     int32_t halfWidth = static_cast<int32_t>(width + Window_EXTERN.ConvertToPx() * 2) / 2;
254     int32_t halfHeight = static_cast<int32_t>(height + Window_EXTERN.ConvertToPx() * 2) / 2;
255 
256     OHOS::sptr<OHOS::Rosen::WindowOption> option = new OHOS::Rosen::WindowOption();
257     option->SetWindowRect({ x - Window_EXTERN.ConvertToPx(), y - Window_EXTERN.ConvertToPx(),
258         width + Window_EXTERN.ConvertToPx() * 2, height + Window_EXTERN.ConvertToPx() * 2 });
259     option->SetHitOffset(halfWidth, halfHeight);
260     option->SetWindowType(OHOS::Rosen::WindowType::WINDOW_TYPE_DRAGGING_EFFECT);
261     option->SetWindowMode(OHOS::Rosen::WindowMode::WINDOW_MODE_FLOATING);
262     option->SetFocusable(false);
263     OHOS::sptr<OHOS::Rosen::Window> dragWindow = OHOS::Rosen::Window::Create(windowName, option);
264     CHECK_NULL_RETURN(dragWindow, nullptr);
265 
266     OHOS::Rosen::WMError ret = dragWindow->Show();
267     if (ret != OHOS::Rosen::WMError::WM_OK) {
268         LOGE("DragWindow::CreateTextDragWindow, drag window Show() failed, ret: %d", ret);
269     }
270 
271     auto window = AceType::MakeRefPtr<DragWindowOhos>(dragWindow);
272     window->SetSize(width + Window_EXTERN.ConvertToPx() * 2, height + Window_EXTERN.ConvertToPx() * 2);
273     return window;
274 }
275 
MoveTo(int32_t x,int32_t y) const276 void DragWindowOhos::MoveTo(int32_t x, int32_t y) const
277 {
278     CHECK_NULL_VOID(dragWindow_);
279 
280     OHOS::Rosen::WMError ret = dragWindow_->MoveTo(x + offsetX_ - width_ / 2, y + offsetY_ - height_ / 2);
281     if (ret != OHOS::Rosen::WMError::WM_OK) {
282         LOGE("DragWindow::MoveTo, drag window move failed, ret: %d", ret);
283         return;
284     }
285 
286     ret = dragWindow_->Show();
287     if (ret != OHOS::Rosen::WMError::WM_OK) {
288         LOGE("DragWindow::CreateDragWindow, drag window Show() failed, ret: %d", ret);
289     }
290 }
291 
TextDragWindowMove(double x,double y) const292 void DragWindowOhos::TextDragWindowMove(double x, double y) const
293 {
294     CHECK_NULL_VOID(dragWindow_);
295     OHOS::Rosen::WMError ret =
296         dragWindow_->MoveTo(x - Window_EXTERN.ConvertToPx() + offsetX_, y + offsetY_ - Window_EXTERN.ConvertToPx());
297     if (ret != OHOS::Rosen::WMError::WM_OK) {
298         LOGE("DragWindow::TextDragWindowMove, drag window move failed, ret: %d", ret);
299         return;
300     }
301 
302     ret = dragWindow_->Show();
303     if (ret != OHOS::Rosen::WMError::WM_OK) {
304         LOGE("DragWindow::TextDragWindowMove, drag window Show() failed, ret: %d", ret);
305     }
306 }
307 
Destroy() const308 void DragWindowOhos::Destroy() const
309 {
310     CHECK_NULL_VOID(dragWindow_);
311 
312     OHOS::Rosen::WMError ret = dragWindow_->Destroy();
313     if (ret != OHOS::Rosen::WMError::WM_OK) {
314         LOGE("DragWindow::Destroy, drag window destroy failed, ret: %d", ret);
315     }
316 }
317 
DrawFrameNode(const RefPtr<NG::FrameNode> & rootNode)318 void DragWindowOhos::DrawFrameNode(const RefPtr<NG::FrameNode>& rootNode)
319 {
320 #ifdef ENABLE_ROSEN_BACKEND
321     CHECK_NULL_VOID(rootNode);
322 
323     auto surfaceNode = dragWindow_->GetSurfaceNode();
324     rsUiDirector_ = Rosen::RSUIDirector::Create();
325     rsUiDirector_->Init();
326     auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
327     if (transactionProxy != nullptr) {
328         transactionProxy->FlushImplicitTransaction();
329     }
330     rsUiDirector_->SetRSSurfaceNode(surfaceNode);
331 
332     auto renderContext = AceType::DynamicCast<NG::RosenRenderContext>(rootNode->GetRenderContext());
333     CHECK_NULL_VOID(renderContext);
334     auto rsNode = renderContext->GetRSNode();
335     CHECK_NULL_VOID(rsNode);
336 
337     rsUiDirector_->SetRoot(rsNode->GetId());
338     rsUiDirector_->SendMessages();
339 #endif
340 }
341 
DrawPixelMap(const RefPtr<PixelMap> & pixelmap)342 void DragWindowOhos::DrawPixelMap(const RefPtr<PixelMap>& pixelmap)
343 {
344 #ifdef ENABLE_ROSEN_BACKEND
345     CHECK_NULL_VOID(pixelmap);
346     auto surfaceNode = dragWindow_->GetSurfaceNode();
347     rsUiDirector_ = Rosen::RSUIDirector::Create();
348     rsUiDirector_->Init();
349     auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
350     if (transactionProxy != nullptr) {
351         transactionProxy->FlushImplicitTransaction();
352     }
353     rsUiDirector_->SetRSSurfaceNode(surfaceNode);
354     rootNode_ = Rosen::RSRootNode::Create();
355     rootNode_->SetBounds(0, 0, static_cast<float>(width_), static_cast<float>(height_));
356     rootNode_->SetFrame(0, 0, static_cast<float>(width_), static_cast<float>(height_));
357     rsUiDirector_->SetRoot(rootNode_->GetId());
358     auto canvasNode = std::static_pointer_cast<Rosen::RSCanvasNode>(rootNode_);
359 #ifndef USE_ROSEN_DRAWING
360     auto skia = canvasNode->BeginRecording(width_, height_);
361     DrawPixelMapInner(skia, pixelmap, width_, height_);
362 #else
363     auto drawing = canvasNode->BeginRecording(width_, height_);
364     DrawPixelMapInner(drawing, pixelmap, width_, height_);
365 #endif
366     canvasNode->FinishRecording();
367     rsUiDirector_->SendMessages();
368 #endif
369 }
370 
371 #ifndef USE_ROSEN_DRAWING
DrawImage(void * skImage)372 void DragWindowOhos::DrawImage(void* skImage)
373 {
374 #ifdef ENABLE_ROSEN_BACKEND
375     CHECK_NULL_VOID(skImage);
376     auto* canvasImagePtr = reinterpret_cast<RefPtr<NG::CanvasImage>*>(skImage);
377     CHECK_NULL_VOID(canvasImagePtr);
378     RefPtr<NG::SkiaImage> canvasImage = AceType::DynamicCast<NG::SkiaImage>(*canvasImagePtr);
379     CHECK_NULL_VOID(canvasImage);
380     auto surfaceNode = dragWindow_->GetSurfaceNode();
381     rsUiDirector_ = Rosen::RSUIDirector::Create();
382     rsUiDirector_->Init();
383     auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
384     if (transactionProxy != nullptr) {
385         transactionProxy->FlushImplicitTransaction();
386     }
387     rsUiDirector_->SetRSSurfaceNode(surfaceNode);
388     rootNode_ = Rosen::RSRootNode::Create();
389     rootNode_->SetBounds(0, 0, static_cast<float>(width_), static_cast<float>(height_));
390     rootNode_->SetFrame(0, 0, static_cast<float>(width_), static_cast<float>(height_));
391     rsUiDirector_->SetRoot(rootNode_->GetId());
392     auto canvasNode = std::static_pointer_cast<Rosen::RSCanvasNode>(rootNode_);
393     auto skia = canvasNode->BeginRecording(width_, height_);
394     DrawSkImage(skia, canvasImage->GetImage(), width_, height_);
395     canvasNode->FinishRecording();
396     rsUiDirector_->SendMessages();
397 #endif
398 }
399 #else
DrawImage(void * drawingImage)400 void DragWindowOhos::DrawImage(void* drawingImage)
401 {
402 #ifdef ENABLE_ROSEN_BACKEND
403     CHECK_NULL_VOID(drawingImage);
404     auto* canvasImagePtr = reinterpret_cast<RefPtr<NG::CanvasImage>*>(drawingImage);
405     CHECK_NULL_VOID(canvasImagePtr);
406     RefPtr<NG::DrawingImage> canvasImage = AceType::DynamicCast<NG::DrawingImage>(*canvasImagePtr);
407     CHECK_NULL_VOID(canvasImage);
408     auto surfaceNode = dragWindow_->GetSurfaceNode();
409     rsUiDirector_ = Rosen::RSUIDirector::Create();
410     rsUiDirector_->Init();
411     auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
412     if (transactionProxy != nullptr) {
413         transactionProxy->FlushImplicitTransaction();
414     }
415     rsUiDirector_->SetRSSurfaceNode(surfaceNode);
416     rootNode_ = Rosen::RSRootNode::Create();
417     rootNode_->SetBounds(0, 0, static_cast<float>(width_), static_cast<float>(height_));
418     rootNode_->SetFrame(0, 0, static_cast<float>(width_), static_cast<float>(height_));
419     rsUiDirector_->SetRoot(rootNode_->GetId());
420     auto canvasNode = std::static_pointer_cast<Rosen::RSCanvasNode>(rootNode_);
421     auto drawing = canvasNode->BeginRecording(width_, height_);
422     auto rsImage = canvasImage->GetImage();
423     DrawDrawingImage(drawing, rsImage, width_, height_);
424     canvasNode->FinishRecording();
425     rsUiDirector_->SendMessages();
426 #endif
427 }
428 #endif
429 
DrawText(std::shared_ptr<txt::Paragraph> paragraph,const Offset & offset,const RefPtr<RenderText> & renderText)430 void DragWindowOhos::DrawText(
431     std::shared_ptr<txt::Paragraph> paragraph, const Offset& offset, const RefPtr<RenderText>& renderText)
432 {
433 #ifdef ENABLE_ROSEN_BACKEND
434     CHECK_NULL_VOID(paragraph);
435     auto surfaceNode = dragWindow_->GetSurfaceNode();
436     rsUiDirector_ = Rosen::RSUIDirector::Create();
437     rsUiDirector_->Init();
438     auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
439     if (transactionProxy != nullptr) {
440         transactionProxy->FlushImplicitTransaction();
441     }
442     rsUiDirector_->SetRSSurfaceNode(surfaceNode);
443     rootNode_ = Rosen::RSRootNode::Create();
444     rootNode_->SetBounds(0, 0, static_cast<float>(width_), static_cast<float>(height_));
445     rootNode_->SetFrame(0, 0, static_cast<float>(width_), static_cast<float>(height_));
446     rsUiDirector_->SetRoot(rootNode_->GetId());
447     auto canvasNode = std::static_pointer_cast<Rosen::RSCanvasNode>(rootNode_);
448 #ifndef USE_ROSEN_DRAWING
449     SkPath path;
450     if (renderText->GetStartOffset().GetY() == renderText->GetEndOffset().GetY()) {
451         path.moveTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
452             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
453         path.lineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
454             renderText->GetEndOffset().GetY() - renderText->GetGlobalOffset().GetY());
455         path.lineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
456             renderText->GetEndOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
457         path.lineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
458             renderText->GetStartOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
459         path.lineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
460             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
461     } else {
462         path.moveTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
463             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
464         path.lineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
465             renderText->GetStartOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
466         path.lineTo(renderText->GetPaintRect().Width(),
467             renderText->GetStartOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
468         path.lineTo(renderText->GetPaintRect().Width(),
469             renderText->GetEndOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
470         path.lineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
471             renderText->GetEndOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
472         path.lineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
473             renderText->GetEndOffset().GetY() - renderText->GetGlobalOffset().GetY());
474         path.lineTo(renderText->GetPaintRect().Left() - renderText->GetGlobalOffset().GetX(),
475             renderText->GetEndOffset().GetY() - renderText->GetGlobalOffset().GetY());
476         path.lineTo(renderText->GetPaintRect().Left() - renderText->GetGlobalOffset().GetX(),
477             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
478         path.lineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
479             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
480     }
481     rootNode_->SetClipToBounds(true);
482     rootNode_->SetClipBounds(Rosen::RSPath::CreateRSPath(path));
483     auto skia = canvasNode->BeginRecording(width_, height_);
484     paragraph->Paint(skia, 0, 0);
485 #else
486     RSRecordingPath path;
487     if (renderText->GetStartOffset().GetY() == renderText->GetEndOffset().GetY()) {
488         path.MoveTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
489             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
490         path.LineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
491             renderText->GetEndOffset().GetY() - renderText->GetGlobalOffset().GetY());
492         path.LineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
493             renderText->GetEndOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
494         path.LineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
495             renderText->GetStartOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
496         path.LineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
497             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
498     } else {
499         path.MoveTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
500             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
501         path.LineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
502             renderText->GetStartOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
503         path.LineTo(renderText->GetPaintRect().Right() - renderText->GetGlobalOffset().GetX(),
504             renderText->GetStartOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
505         path.LineTo(renderText->GetPaintRect().Right() - renderText->GetGlobalOffset().GetX(),
506             renderText->GetEndOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
507         path.LineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
508             renderText->GetEndOffset().GetY() - renderText->GetSelectHeight() - renderText->GetGlobalOffset().GetY());
509         path.LineTo(renderText->GetEndOffset().GetX() - renderText->GetGlobalOffset().GetX(),
510             renderText->GetEndOffset().GetY() - renderText->GetGlobalOffset().GetY());
511         path.LineTo(renderText->GetPaintRect().Left() - renderText->GetGlobalOffset().GetX(),
512             renderText->GetEndOffset().GetY() - renderText->GetGlobalOffset().GetY());
513         path.LineTo(renderText->GetPaintRect().Left() - renderText->GetGlobalOffset().GetX(),
514             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
515         path.LineTo(renderText->GetStartOffset().GetX() - renderText->GetGlobalOffset().GetX(),
516             renderText->GetStartOffset().GetY() - renderText->GetGlobalOffset().GetY());
517     }
518     rootNode_->SetClipToBounds(true);
519     rootNode_->SetClipBounds(Rosen::RSPath::CreateRSPath(path));
520     LOGE("Drawing is not supported");
521 #endif
522     canvasNode->FinishRecording();
523     rsUiDirector_->SendMessages();
524 #endif
525 }
526 
DrawTextNG(const RefPtr<NG::Paragraph> & paragraph,const RefPtr<NG::TextPattern> & textPattern)527 void DragWindowOhos::DrawTextNG(const RefPtr<NG::Paragraph>& paragraph, const RefPtr<NG::TextPattern>& textPattern)
528 {
529 #ifdef ENABLE_ROSEN_BACKEND
530     CHECK_NULL_VOID(paragraph);
531     auto surfaceNode = dragWindow_->GetSurfaceNode();
532     rsUiDirector_ = Rosen::RSUIDirector::Create();
533     CHECK_NULL_VOID(rsUiDirector_);
534     rsUiDirector_->Init();
535     auto transactionProxy = Rosen::RSTransactionProxy::GetInstance();
536     if (transactionProxy != nullptr) {
537         transactionProxy->FlushImplicitTransaction();
538     }
539     rsUiDirector_->SetRSSurfaceNode(surfaceNode);
540 
541     rootNode_ = Rosen::RSRootNode::Create();
542     CHECK_NULL_VOID(rootNode_);
543     rootNode_->SetBounds(Window_EXTERN.ConvertToPx(), Window_EXTERN.ConvertToPx(), static_cast<float>(width_),
544         static_cast<float>(height_));
545     rootNode_->SetFrame(Window_EXTERN.ConvertToPx(), Window_EXTERN.ConvertToPx(), static_cast<float>(width_),
546         static_cast<float>(height_));
547     rsUiDirector_->SetRoot(rootNode_->GetId());
548     auto canvasNode = std::static_pointer_cast<Rosen::RSCanvasNode>(rootNode_);
549     CHECK_NULL_VOID(canvasNode);
550     Offset globalOffset;
551     textPattern->GetGlobalOffset(globalOffset);
552 #ifndef USE_ROSEN_DRAWING
553     SkPath path;
554     if (textPattern->GetStartOffset().GetY() == textPattern->GetEndOffset().GetY()) {
555         path.moveTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
556             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
557         path.lineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
558             textPattern->GetEndOffset().GetY() - globalOffset.GetY());
559         path.lineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
560             textPattern->GetEndOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
561         path.lineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
562             textPattern->GetStartOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
563         path.lineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
564             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
565     } else {
566         path.moveTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
567             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
568         path.lineTo(
569             textPattern->GetTextContentRect().Width(), textPattern->GetStartOffset().GetY() - globalOffset.GetY());
570         path.lineTo(
571             textPattern->GetTextContentRect().Width(), textPattern->GetEndOffset().GetY() - globalOffset.GetY());
572         path.lineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
573             textPattern->GetEndOffset().GetY() - globalOffset.GetY());
574         path.lineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
575             textPattern->GetEndOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
576         path.lineTo(textPattern->GetTextContentRect().GetX(),
577             textPattern->GetEndOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
578         path.lineTo(textPattern->GetTextContentRect().GetX(),
579             textPattern->GetStartOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
580         path.lineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
581             textPattern->GetStartOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
582         path.lineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
583             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
584     }
585     rootNode_->SetClipToBounds(true);
586     rootNode_->SetClipBounds(Rosen::RSPath::CreateRSPath(path));
587 
588     auto skia = canvasNode->BeginRecording(width_, height_);
589     paragraph->Paint(skia, textPattern->GetTextContentRect().GetX(),
590         textPattern->GetTextContentRect().GetY() - std::min(textPattern->GetBaselineOffset(), 0.0f));
591 #else
592     RSRecordingPath path;
593     if (textPattern->GetStartOffset().GetY() == textPattern->GetEndOffset().GetY()) {
594         path.MoveTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
595             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
596         path.LineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
597             textPattern->GetEndOffset().GetY() - globalOffset.GetY());
598         path.LineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
599             textPattern->GetEndOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
600         path.LineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
601             textPattern->GetStartOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
602         path.LineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
603             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
604     } else {
605         path.MoveTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
606             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
607         path.LineTo(
608             textPattern->GetTextContentRect().Width(), textPattern->GetStartOffset().GetY() - globalOffset.GetY());
609         path.LineTo(
610             textPattern->GetTextContentRect().Width(), textPattern->GetEndOffset().GetY() - globalOffset.GetY());
611         path.LineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
612             textPattern->GetEndOffset().GetY() - globalOffset.GetY());
613         path.LineTo(textPattern->GetEndOffset().GetX() - globalOffset.GetX(),
614             textPattern->GetEndOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
615         path.LineTo(textPattern->GetTextContentRect().GetX(),
616             textPattern->GetEndOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
617         path.LineTo(textPattern->GetTextContentRect().GetX(),
618             textPattern->GetStartOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
619         path.LineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
620             textPattern->GetStartOffset().GetY() + textPattern->GetSelectHeight() - globalOffset.GetY());
621         path.LineTo(textPattern->GetStartOffset().GetX() - globalOffset.GetX(),
622             textPattern->GetStartOffset().GetY() - globalOffset.GetY());
623     }
624     rootNode_->SetClipToBounds(true);
625     rootNode_->SetClipBounds(Rosen::RSPath::CreateRSPath(path));
626 #endif
627     canvasNode->FinishRecording();
628     rsUiDirector_->SendMessages();
629 
630     auto context = NG::PipelineContext::GetCurrentContext();
631     CHECK_NULL_VOID(context);
632     context->RequestFrame();
633 #endif
634 }
635 } // namespace OHOS::Ace
636