1a3e0fd82Sopenharmony_ci/* 2a3e0fd82Sopenharmony_ci * Copyright (c) 2022 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/** 17a3e0fd82Sopenharmony_ci * @brief Defines Base renderer 18a3e0fd82Sopenharmony_ci * @since 1.0 19a3e0fd82Sopenharmony_ci * @version 1.0. 20a3e0fd82Sopenharmony_ci */ 21a3e0fd82Sopenharmony_ci 22a3e0fd82Sopenharmony_ci#include "render_base.h" 23a3e0fd82Sopenharmony_ci 24a3e0fd82Sopenharmony_cinamespace OHOS { 25a3e0fd82Sopenharmony_civoid RenderBase::Attach(RenderPixfmtRgbaBlend& ren) 26a3e0fd82Sopenharmony_ci{ 27a3e0fd82Sopenharmony_ci pixfmtType_ = &ren; 28a3e0fd82Sopenharmony_ci clipBox_.SetRect(0, 0, ren.GetWidth() - 1, ren.GetHeight() - 1); 29a3e0fd82Sopenharmony_ci} 30a3e0fd82Sopenharmony_ci 31a3e0fd82Sopenharmony_cibool RenderBase::ClipBox(int32_t x1, int32_t y1, int32_t x2, int32_t y2) 32a3e0fd82Sopenharmony_ci{ 33a3e0fd82Sopenharmony_ci Rect32 cb(x1, y1, x2, y2); 34a3e0fd82Sopenharmony_ci cb.Normalize(); 35a3e0fd82Sopenharmony_ci if (cb.Intersect(cb, Rect32(0, 0, GetWidth() - 1, GetHeight() - 1))) { 36a3e0fd82Sopenharmony_ci clipBox_.SetRect(cb.GetLeft(), cb.GetTop(), cb.GetRight(), cb.GetBottom()); 37a3e0fd82Sopenharmony_ci return true; 38a3e0fd82Sopenharmony_ci } 39a3e0fd82Sopenharmony_ci ClipBoxNaked(1, 1, 0, 0); 40a3e0fd82Sopenharmony_ci return false; 41a3e0fd82Sopenharmony_ci} 42a3e0fd82Sopenharmony_ci 43a3e0fd82Sopenharmony_civoid RenderBase::ResetClipping(bool visibility) 44a3e0fd82Sopenharmony_ci{ 45a3e0fd82Sopenharmony_ci if (visibility) { 46a3e0fd82Sopenharmony_ci ClipBoxNaked(0, 0, GetWidth() - 1, GetHeight() - 1); 47a3e0fd82Sopenharmony_ci } else { 48a3e0fd82Sopenharmony_ci ClipBoxNaked(1, 1, 0, 0); 49a3e0fd82Sopenharmony_ci } 50a3e0fd82Sopenharmony_ci} 51a3e0fd82Sopenharmony_ci 52a3e0fd82Sopenharmony_civoid RenderBase::ClipBoxNaked(int32_t x1, int32_t y1, int32_t x2, int32_t y2) 53a3e0fd82Sopenharmony_ci{ 54a3e0fd82Sopenharmony_ci clipBox_.SetRect(x1, y1, x2, y2); 55a3e0fd82Sopenharmony_ci} 56a3e0fd82Sopenharmony_ci 57a3e0fd82Sopenharmony_civoid RenderBase::Clear(const Rgba8T& color) 58a3e0fd82Sopenharmony_ci{ 59a3e0fd82Sopenharmony_ci if (GetWidth()) { 60a3e0fd82Sopenharmony_ci for (uint32_t y = 0; y < GetHeight(); y++) { 61a3e0fd82Sopenharmony_ci pixfmtType_->CopyHLine(0, y, GetWidth(), color); 62a3e0fd82Sopenharmony_ci } 63a3e0fd82Sopenharmony_ci } 64a3e0fd82Sopenharmony_ci} 65a3e0fd82Sopenharmony_ci 66a3e0fd82Sopenharmony_civoid RenderBase::BlendHLine(int32_t x1, int32_t y, int32_t x2, const Rgba8T& color, uint8_t cover) 67a3e0fd82Sopenharmony_ci{ 68a3e0fd82Sopenharmony_ci if (x1 > x2) { 69a3e0fd82Sopenharmony_ci int32_t swapTemp = x1; 70a3e0fd82Sopenharmony_ci x1 = x2; 71a3e0fd82Sopenharmony_ci x2 = swapTemp; 72a3e0fd82Sopenharmony_ci } 73a3e0fd82Sopenharmony_ci if (y > GetYMax() || y < GetYMin() || x1 > GetXMax() || x2 < GetXMin()) { 74a3e0fd82Sopenharmony_ci return; 75a3e0fd82Sopenharmony_ci } 76a3e0fd82Sopenharmony_ci if (x1 < GetXMin()) { 77a3e0fd82Sopenharmony_ci x1 = GetXMin(); 78a3e0fd82Sopenharmony_ci } 79a3e0fd82Sopenharmony_ci 80a3e0fd82Sopenharmony_ci if (x2 > GetXMax()) { 81a3e0fd82Sopenharmony_ci x2 = GetXMax(); 82a3e0fd82Sopenharmony_ci } 83a3e0fd82Sopenharmony_ci pixfmtType_->BlendHLine(x1, y, x2 - x1 + 1, color, cover); 84a3e0fd82Sopenharmony_ci} 85a3e0fd82Sopenharmony_ci 86a3e0fd82Sopenharmony_civoid RenderBase::BlendSolidHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T& color, const uint8_t* covers) 87a3e0fd82Sopenharmony_ci{ 88a3e0fd82Sopenharmony_ci if (y > GetYMax() || y < GetYMin()) { 89a3e0fd82Sopenharmony_ci return; 90a3e0fd82Sopenharmony_ci } 91a3e0fd82Sopenharmony_ci if (x < GetXMin()) { 92a3e0fd82Sopenharmony_ci len -= GetXMin() - x; 93a3e0fd82Sopenharmony_ci if (len <= 0) { 94a3e0fd82Sopenharmony_ci return; 95a3e0fd82Sopenharmony_ci } 96a3e0fd82Sopenharmony_ci covers += GetXMin() - x; 97a3e0fd82Sopenharmony_ci x = GetXMin(); 98a3e0fd82Sopenharmony_ci } 99a3e0fd82Sopenharmony_ci if (x + len > GetXMax()) { 100a3e0fd82Sopenharmony_ci len = GetXMax() - x + 1; 101a3e0fd82Sopenharmony_ci if (len <= 0) { 102a3e0fd82Sopenharmony_ci return; 103a3e0fd82Sopenharmony_ci } 104a3e0fd82Sopenharmony_ci } 105a3e0fd82Sopenharmony_ci pixfmtType_->BlendSolidHSpan(x, y, len, color, covers); 106a3e0fd82Sopenharmony_ci} 107a3e0fd82Sopenharmony_ci 108a3e0fd82Sopenharmony_civoid RenderBase::CopyColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors) 109a3e0fd82Sopenharmony_ci{ 110a3e0fd82Sopenharmony_ci const uint8_t* covers = nullptr; 111a3e0fd82Sopenharmony_ci if (!ColorHSpanHandler(x, y, len, colors, covers)) { 112a3e0fd82Sopenharmony_ci return; 113a3e0fd82Sopenharmony_ci } 114a3e0fd82Sopenharmony_ci pixfmtType_->CopyColorHSpan(x, y, len, colors); 115a3e0fd82Sopenharmony_ci} 116a3e0fd82Sopenharmony_ci 117a3e0fd82Sopenharmony_civoid RenderBase::BlendColorHSpan(int32_t x, int32_t y, int32_t len, const Rgba8T* colors, const uint8_t* covers, 118a3e0fd82Sopenharmony_ci uint8_t cover) 119a3e0fd82Sopenharmony_ci{ 120a3e0fd82Sopenharmony_ci if (!ColorHSpanHandler(x, y, len, colors, covers)) { 121a3e0fd82Sopenharmony_ci return; 122a3e0fd82Sopenharmony_ci } 123a3e0fd82Sopenharmony_ci pixfmtType_->BlendColorHSpan(x, y, len, colors, covers, cover); 124a3e0fd82Sopenharmony_ci} 125a3e0fd82Sopenharmony_ci 126a3e0fd82Sopenharmony_cibool RenderBase::ColorHSpanHandler(int32_t& x, const int32_t& y, int32_t& len, const Rgba8T*& colors, 127a3e0fd82Sopenharmony_ci const uint8_t*& covers) const 128a3e0fd82Sopenharmony_ci{ 129a3e0fd82Sopenharmony_ci if (y > GetYMax() || y < GetYMin()) { 130a3e0fd82Sopenharmony_ci return false; 131a3e0fd82Sopenharmony_ci } 132a3e0fd82Sopenharmony_ci if (x < GetXMin()) { 133a3e0fd82Sopenharmony_ci int32_t d = GetXMin() - x; 134a3e0fd82Sopenharmony_ci len -= d; 135a3e0fd82Sopenharmony_ci if (len <= 0) { 136a3e0fd82Sopenharmony_ci return false; 137a3e0fd82Sopenharmony_ci } 138a3e0fd82Sopenharmony_ci if (covers) { 139a3e0fd82Sopenharmony_ci covers += d; 140a3e0fd82Sopenharmony_ci } 141a3e0fd82Sopenharmony_ci colors += d; 142a3e0fd82Sopenharmony_ci x = GetXMin(); 143a3e0fd82Sopenharmony_ci } 144a3e0fd82Sopenharmony_ci if (x + len > GetXMax()) { 145a3e0fd82Sopenharmony_ci len = GetXMax() - x + 1; 146a3e0fd82Sopenharmony_ci if (len <= 0) { 147a3e0fd82Sopenharmony_ci return false; 148a3e0fd82Sopenharmony_ci } 149a3e0fd82Sopenharmony_ci } 150a3e0fd82Sopenharmony_ci return true; 151a3e0fd82Sopenharmony_ci} 152a3e0fd82Sopenharmony_ci} // namespace OHOS 153