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