1a3e0fd82Sopenharmony_ci/*
2a3e0fd82Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3a3e0fd82Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4a3e0fd82Sopenharmony_ci * you may not use this file except in compliance with the License.
5a3e0fd82Sopenharmony_ci * You may obtain a copy of the License at
6a3e0fd82Sopenharmony_ci *
7a3e0fd82Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8a3e0fd82Sopenharmony_ci *
9a3e0fd82Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10a3e0fd82Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11a3e0fd82Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a3e0fd82Sopenharmony_ci * See the License for the specific language governing permissions and
13a3e0fd82Sopenharmony_ci * limitations under the License.
14a3e0fd82Sopenharmony_ci */
15a3e0fd82Sopenharmony_ci
16a3e0fd82Sopenharmony_ci#include "draw/draw_image.h"
17a3e0fd82Sopenharmony_ci
18a3e0fd82Sopenharmony_ci#include "gfx_utils/color.h"
19a3e0fd82Sopenharmony_ci#include "gfx_utils/graphic_log.h"
20a3e0fd82Sopenharmony_ci#include "imgdecode/cache_manager.h"
21a3e0fd82Sopenharmony_ci
22a3e0fd82Sopenharmony_cinamespace OHOS {
23a3e0fd82Sopenharmony_civoid DrawImage::DrawCommon(BufferInfo& gfxDstBuffer, const Rect& coords, const Rect& mask,
24a3e0fd82Sopenharmony_ci    const ImageInfo* img, const Style& style, uint8_t opaScale)
25a3e0fd82Sopenharmony_ci{
26a3e0fd82Sopenharmony_ci    if (img == nullptr) {
27a3e0fd82Sopenharmony_ci        return;
28a3e0fd82Sopenharmony_ci    }
29a3e0fd82Sopenharmony_ci    OpacityType opa = DrawUtils::GetMixOpacity(opaScale, style.imageOpa_);
30a3e0fd82Sopenharmony_ci    uint8_t pxBitSize = DrawUtils::GetPxSizeByColorMode(img->header.colorMode);
31a3e0fd82Sopenharmony_ci    DrawUtils::GetInstance()->DrawImage(gfxDstBuffer, coords, mask, img->data, opa, pxBitSize,
32a3e0fd82Sopenharmony_ci                                        static_cast<ColorMode>(img->header.colorMode));
33a3e0fd82Sopenharmony_ci}
34a3e0fd82Sopenharmony_ci
35a3e0fd82Sopenharmony_civoid DrawImage::DrawCommon(BufferInfo& gfxDstBuffer, const Rect& coords, const Rect& mask,
36a3e0fd82Sopenharmony_ci    const char* path, const Style& style, uint8_t opaScale)
37a3e0fd82Sopenharmony_ci{
38a3e0fd82Sopenharmony_ci    if (path == nullptr) {
39a3e0fd82Sopenharmony_ci        return;
40a3e0fd82Sopenharmony_ci    }
41a3e0fd82Sopenharmony_ci    OpacityType opa = DrawUtils::GetMixOpacity(opaScale, style.imageOpa_);
42a3e0fd82Sopenharmony_ci
43a3e0fd82Sopenharmony_ci    CacheEntry entry;
44a3e0fd82Sopenharmony_ci    if (CacheManager::GetInstance().Open(path, style, entry) != RetCode::OK) {
45a3e0fd82Sopenharmony_ci        return;
46a3e0fd82Sopenharmony_ci    }
47a3e0fd82Sopenharmony_ci
48a3e0fd82Sopenharmony_ci    uint8_t pxBitSize = DrawUtils::GetPxSizeByColorMode(entry.GetImageInfo().header.colorMode);
49a3e0fd82Sopenharmony_ci    if (entry.InCache()) {
50a3e0fd82Sopenharmony_ci        DrawUtils::GetInstance()->DrawImage(gfxDstBuffer, coords, mask, entry.GetImgData(), opa, pxBitSize,
51a3e0fd82Sopenharmony_ci                                            static_cast<ColorMode>(entry.GetImageInfo().header.colorMode));
52a3e0fd82Sopenharmony_ci    } else {
53a3e0fd82Sopenharmony_ci        Rect valid = coords;
54a3e0fd82Sopenharmony_ci        if (!valid.Intersect(valid, mask)) {
55a3e0fd82Sopenharmony_ci            return;
56a3e0fd82Sopenharmony_ci        }
57a3e0fd82Sopenharmony_ci
58a3e0fd82Sopenharmony_ci        int16_t width = valid.GetWidth();
59a3e0fd82Sopenharmony_ci        if (width <= 0) {
60a3e0fd82Sopenharmony_ci            return;
61a3e0fd82Sopenharmony_ci        }
62a3e0fd82Sopenharmony_ci        uint8_t* buf = static_cast<uint8_t*>(UIMalloc(static_cast<uint32_t>(width) * ((COLOR_DEPTH >> SHIFT_3) + 1)));
63a3e0fd82Sopenharmony_ci        if (buf == nullptr) {
64a3e0fd82Sopenharmony_ci            return;
65a3e0fd82Sopenharmony_ci        }
66a3e0fd82Sopenharmony_ci
67a3e0fd82Sopenharmony_ci        Rect line = valid;
68a3e0fd82Sopenharmony_ci        line.SetHeight(1);
69a3e0fd82Sopenharmony_ci        Point start;
70a3e0fd82Sopenharmony_ci        start.x = valid.GetLeft() - coords.GetLeft();
71a3e0fd82Sopenharmony_ci        start.y = valid.GetTop() - coords.GetTop();
72a3e0fd82Sopenharmony_ci        for (int16_t row = valid.GetTop(); row <= valid.GetBottom(); row++) {
73a3e0fd82Sopenharmony_ci            if (entry.ReadLine(start, width, buf) != RetCode::OK) {
74a3e0fd82Sopenharmony_ci                CacheManager::GetInstance().Close(path);
75a3e0fd82Sopenharmony_ci                UIFree(buf);
76a3e0fd82Sopenharmony_ci                return;
77a3e0fd82Sopenharmony_ci            }
78a3e0fd82Sopenharmony_ci            DrawUtils::GetInstance()->DrawImage(gfxDstBuffer, line, mask, buf, opa, pxBitSize,
79a3e0fd82Sopenharmony_ci                                                static_cast<ColorMode>(entry.GetImageInfo().header.colorMode));
80a3e0fd82Sopenharmony_ci            line.SetTop(line.GetTop() + 1);
81a3e0fd82Sopenharmony_ci            line.SetBottom(line.GetBottom() + 1);
82a3e0fd82Sopenharmony_ci            start.y++;
83a3e0fd82Sopenharmony_ci        }
84a3e0fd82Sopenharmony_ci        UIFree(buf);
85a3e0fd82Sopenharmony_ci    }
86a3e0fd82Sopenharmony_ci}
87a3e0fd82Sopenharmony_ci} // namespace OHOS
88