1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3cb93a386Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4cb93a386Sopenharmony_ci * you may not use this file except in compliance with the License.
5cb93a386Sopenharmony_ci * You may obtain a copy of the License at
6cb93a386Sopenharmony_ci *
7cb93a386Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8cb93a386Sopenharmony_ci *
9cb93a386Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10cb93a386Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11cb93a386Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cb93a386Sopenharmony_ci * See the License for the specific language governing permissions and
13cb93a386Sopenharmony_ci * limitations under the License.
14cb93a386Sopenharmony_ci */
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_ci#include "src/core/SkPathComplexityDfx.h"
17cb93a386Sopenharmony_ci#include "src/core/SkTraceEvent.h"
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_ci#ifdef SK_ENABLE_PATH_COMPLEXITY_DFX
20cb93a386Sopenharmony_ciconstexpr int PATH_TRACE_LEVEL = 1;
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ciint GetDebugTraceLevel()
23cb93a386Sopenharmony_ci{
24cb93a386Sopenharmony_ci    static int openDebugTraceLevel =
25cb93a386Sopenharmony_ci        std::atoi((OHOS::system::GetParameter("persist.sys.graphic.openDebugTrace", "0")).c_str());
26cb93a386Sopenharmony_ci    return openDebugTraceLevel;
27cb93a386Sopenharmony_ci}
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_cibool IsShowPathComplexityEnabled()
30cb93a386Sopenharmony_ci{
31cb93a386Sopenharmony_ci    static bool enabled =
32cb93a386Sopenharmony_ci        std::atoi((OHOS::system::GetParameter("persist.sys.graphic.showPathComplexity", "0")).c_str()) != 0;
33cb93a386Sopenharmony_ci    return enabled;
34cb93a386Sopenharmony_ci}
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_civoid SkPathComplexityDfx::AddPathComplexityTrace(SkScalar complexity)
38cb93a386Sopenharmony_ci{
39cb93a386Sopenharmony_ci    if (GetDebugTraceLevel() >= PATH_TRACE_LEVEL) {
40cb93a386Sopenharmony_ci        HITRACE_OHOS_NAME_FMT_ALWAYS("Path Complexity Debug: %f", complexity);
41cb93a386Sopenharmony_ci    }
42cb93a386Sopenharmony_ci}
43cb93a386Sopenharmony_civoid SkPathComplexityDfx::ShowPathComplexityDfx(SkCanvas* canvas, const SkPath& path)
44cb93a386Sopenharmony_ci{
45cb93a386Sopenharmony_ci    if (!canvas) {
46cb93a386Sopenharmony_ci        return;
47cb93a386Sopenharmony_ci    }
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    if (IsShowPathComplexityEnabled()) {
50cb93a386Sopenharmony_ci        constexpr size_t MESSAGE_SIZE = 4;
51cb93a386Sopenharmony_ci        constexpr SkScalar MESSAGE_FONT_SIZE = 30.0f;
52cb93a386Sopenharmony_ci        constexpr SkScalar MARGIN_LENGTH = 10.0f;
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ci        SkScalar complexity = 0.f;
55cb93a386Sopenharmony_ci        SkScalar avgLength = 0.f;
56cb93a386Sopenharmony_ci        compute_complexity(path, avgLength, complexity);
57cb93a386Sopenharmony_ci        std::string message = std::to_string(complexity).substr(0, MESSAGE_SIZE);
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci        SkFont tempFont;
60cb93a386Sopenharmony_ci        tempFont.setSize(MESSAGE_FONT_SIZE / (std::abs(canvas->getTotalMatrix().get(0)) + 1e-3));
61cb93a386Sopenharmony_ci        SkPaint tempPaint;
62cb93a386Sopenharmony_ci        tempPaint.setColor(SK_ColorRED);
63cb93a386Sopenharmony_ci        canvas->drawSimpleText(message.c_str(), MESSAGE_SIZE, SkTextEncoding::kUTF8,
64cb93a386Sopenharmony_ci            0, MARGIN_LENGTH, tempFont, tempPaint);
65cb93a386Sopenharmony_ci    }
66cb93a386Sopenharmony_ci}
67cb93a386Sopenharmony_ci#endif
68