ui_surface_view.cpp 4.7 KB
Newer Older
M
mamingshuai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "components/ui_surface_view.h"
邓志豪 已提交
17
#if ENABLE_WINDOW
M
mamingshuai 已提交
18 19 20 21
#include <string>

#include "draw/draw_rect.h"
#include "draw/draw_utils.h"
Z
zhangguyuan 已提交
22
#include "gfx_utils/graphic_log.h"
M
mamingshuai 已提交
23 24 25 26 27 28 29
#include "surface_buffer.h"

namespace OHOS {
UISurfaceView::UISurfaceView()
{
    surface_ = Surface::CreateSurface();
    if (surface_ == nullptr) {
30
        GRAPHIC_LOGE("UISurfaceView::UISurfaceView surface create failed\n");
M
mamingshuai 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
        return;
    }
    surface_->SetWidthAndHeight(GetWidth(), GetHeight());
    surface_->SetQueueSize(DEFAULT_QUEUE_SIZE);
    surface_->SetFormat(IMAGE_PIXEL_FORMAT_ARGB8888);
}

UISurfaceView::~UISurfaceView()
{
    if (surface_ != nullptr) {
        delete surface_;
        surface_ = nullptr;
    }
}

void UISurfaceView::SetPosition(int16_t x, int16_t y)
{
    UIView::SetPosition(x, y);
    if (surface_ == nullptr) {
50
        GRAPHIC_LOGE("UISurfaceView::SetPosition surface is null\n");
M
mamingshuai 已提交
51 52 53 54 55 56 57 58 59 60 61 62
        return;
    }
    x = GetRect().GetLeft();
    y = GetRect().GetTop();
    surface_->SetUserData(REGION_POSITION_X, std::to_string(x));
    surface_->SetUserData(REGION_POSITION_Y, std::to_string(y));
}

void UISurfaceView::SetPosition(int16_t x, int16_t y, int16_t width, int16_t height)
{
    UIView::SetPosition(x, y, width, height);
    if (surface_ == nullptr) {
63
        GRAPHIC_LOGE("UISurfaceView::SetPosition surface is null\n");
M
mamingshuai 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76 77
        return;
    }
    x = GetRect().GetLeft();
    y = GetRect().GetTop();
    surface_->SetUserData(REGION_POSITION_X, std::to_string(x));
    surface_->SetUserData(REGION_POSITION_Y, std::to_string(y));
    surface_->SetUserData(REGION_WIDTH, std::to_string(width));
    surface_->SetUserData(REGION_HEIGHT, std::to_string(height));
}

void UISurfaceView::Resize(int16_t width, int16_t height)
{
    UIView::Resize(width, height);
    if (surface_ == nullptr) {
78
        GRAPHIC_LOGE("UISurfaceView::Resize surface is null\n");
M
mamingshuai 已提交
79 80 81 82 83 84 85 86 87 88
        return;
    }
    surface_->SetUserData(REGION_WIDTH, std::to_string(width));
    surface_->SetUserData(REGION_HEIGHT, std::to_string(height));
}

void UISurfaceView::SetWidth(int16_t width)
{
    UIView::SetWidth(width);
    if (surface_ == nullptr) {
89
        GRAPHIC_LOGE("UISurfaceView::SetWidth surface is null\n");
M
mamingshuai 已提交
90 91 92 93 94 95 96 97 98
        return;
    }
    surface_->SetUserData(REGION_WIDTH, std::to_string(width));
}

void UISurfaceView::SetHeight(int16_t height)
{
    UIView::SetHeight(height);
    if (surface_ == nullptr) {
99
        GRAPHIC_LOGE("UISurfaceView::SetHeight surface is null\n");
M
mamingshuai 已提交
100 101 102 103 104 105 106 107 108
        return;
    }
    surface_->SetUserData(REGION_HEIGHT, std::to_string(height));
}

void UISurfaceView::SetX(int16_t x)
{
    UIView::SetX(x);
    if (surface_ == nullptr) {
109
        GRAPHIC_LOGE("UISurfaceView::SetX surface is null\n");
M
mamingshuai 已提交
110 111 112 113 114 115 116 117 118 119
        return;
    }
    x = GetRect().GetLeft();
    surface_->SetUserData(REGION_POSITION_X, std::to_string(x));
}

void UISurfaceView::SetY(int16_t y)
{
    UIView::SetY(y);
    if (surface_ == nullptr) {
120
        GRAPHIC_LOGE("UISurfaceView::SetY surface is null\n");
M
mamingshuai 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
        return;
    }
    y = GetRect().GetTop();
    surface_->SetUserData(REGION_POSITION_Y, std::to_string(y));
}

Surface* UISurfaceView::GetSurface() const
{
    return surface_;
}

bool UISurfaceView::OnPreDraw(Rect& invalidatedArea) const
{
    // need fill transpant color
    return false;
}

N
niulihua 已提交
138
void UISurfaceView::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
M
mamingshuai 已提交
139
{
N
niulihua 已提交
140
    Draw(gfxDstBuffer, invalidatedArea);
M
mamingshuai 已提交
141 142
}

N
niulihua 已提交
143
void UISurfaceView::Draw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
M
mamingshuai 已提交
144 145 146
{
    SurfaceBuffer* acquireBuffer = (surface_ != nullptr) ? surface_->AcquireBuffer() : nullptr;
    if (acquireBuffer != nullptr) {
147
        GRAPHIC_LOGE("UISurfaceView::Draw acquireBufferVirAddr=%p \n", acquireBuffer->GetVirAddr());
M
mamingshuai 已提交
148
        // fill with buffer
N
niulihua 已提交
149
        DrawUtils::GetInstance()->DrawWithBuffer(gfxDstBuffer, GetRect(), invalidatedArea,
M
mamingshuai 已提交
150 151 152 153
                                                 reinterpret_cast<const ColorType*>(acquireBuffer->GetVirAddr()));
        surface_->ReleaseBuffer(acquireBuffer);
    } else {
        // fill with transpant color
N
niulihua 已提交
154
        DrawUtils::GetInstance()->DrawTranspantArea(gfxDstBuffer, GetRect(), invalidatedArea);
M
mamingshuai 已提交
155 156 157
    }
}
} // namespace OHOS
邓志豪 已提交
158
#endif // ENABLE_WINDOW