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#include "font/glyphs_cache.h" 17a3e0fd82Sopenharmony_ci#include "font/font_ram_allocator.h" 18a3e0fd82Sopenharmony_ci#include "font/ui_font_builder.h" 19a3e0fd82Sopenharmony_ci#include "gfx_utils/graphic_log.h" 20a3e0fd82Sopenharmony_ci#include "securec.h" 21a3e0fd82Sopenharmony_ci 22a3e0fd82Sopenharmony_cinamespace OHOS { 23a3e0fd82Sopenharmony_ciGlyphsCache::GlyphsCache() 24a3e0fd82Sopenharmony_ci : nodeCache_(nullptr), 25a3e0fd82Sopenharmony_ci cacheStatus_(nullptr), 26a3e0fd82Sopenharmony_ci hasInit_(false) 27a3e0fd82Sopenharmony_ci{ 28a3e0fd82Sopenharmony_ci} 29a3e0fd82Sopenharmony_ciGlyphsCache::~GlyphsCache() {} 30a3e0fd82Sopenharmony_ci 31a3e0fd82Sopenharmony_ciint8_t GlyphsCache::CacheInit() 32a3e0fd82Sopenharmony_ci{ 33a3e0fd82Sopenharmony_ci if (hasInit_) { 34a3e0fd82Sopenharmony_ci return RET_VALUE_OK; 35a3e0fd82Sopenharmony_ci } 36a3e0fd82Sopenharmony_ci 37a3e0fd82Sopenharmony_ci cacheStatus_ = reinterpret_cast<CacheState*>(FontRamAllocator::GetInstance().DynamicAllocate(sizeof(CacheState))); 38a3e0fd82Sopenharmony_ci if (cacheStatus_ == nullptr) { 39a3e0fd82Sopenharmony_ci GRAPHIC_LOGE("GlyphsCache::CacheInit allocate cache status failed"); 40a3e0fd82Sopenharmony_ci return INVALID_RET_VALUE; 41a3e0fd82Sopenharmony_ci } 42a3e0fd82Sopenharmony_ci 43a3e0fd82Sopenharmony_ci if (memset_s(cacheStatus_, sizeof(CacheState), 0, sizeof(CacheState)) != EOK) { 44a3e0fd82Sopenharmony_ci GRAPHIC_LOGE("GlyphsCache::CacheInit init cache status failed"); 45a3e0fd82Sopenharmony_ci return INVALID_RET_VALUE; 46a3e0fd82Sopenharmony_ci } 47a3e0fd82Sopenharmony_ci 48a3e0fd82Sopenharmony_ci nodeCache_ = reinterpret_cast<CacheType*>(FontRamAllocator::GetInstance().DynamicAllocate(sizeof(CacheType))); 49a3e0fd82Sopenharmony_ci if (nodeCache_ == nullptr) { 50a3e0fd82Sopenharmony_ci GRAPHIC_LOGE("GlyphsCache::CacheInit allocate node cache failed"); 51a3e0fd82Sopenharmony_ci return INVALID_RET_VALUE; 52a3e0fd82Sopenharmony_ci } 53a3e0fd82Sopenharmony_ci 54a3e0fd82Sopenharmony_ci if (memset_s(nodeCache_, sizeof(CacheType), 0, sizeof(CacheType)) != EOK) { 55a3e0fd82Sopenharmony_ci GRAPHIC_LOGE("GlyphsCache::CacheInit init node cache failed"); 56a3e0fd82Sopenharmony_ci return INVALID_RET_VALUE; 57a3e0fd82Sopenharmony_ci } 58a3e0fd82Sopenharmony_ci 59a3e0fd82Sopenharmony_ci hasInit_ = true; 60a3e0fd82Sopenharmony_ci return RET_VALUE_OK; 61a3e0fd82Sopenharmony_ci} 62a3e0fd82Sopenharmony_ci 63a3e0fd82Sopenharmony_civoid GlyphsCache::ClearCacheFlag() 64a3e0fd82Sopenharmony_ci{ 65a3e0fd82Sopenharmony_ci hasInit_ = false; 66a3e0fd82Sopenharmony_ci} 67a3e0fd82Sopenharmony_ci 68a3e0fd82Sopenharmony_ciGlyphCacheNode* GlyphsCache::GetNodeFromCache(uint32_t unicode, uint16_t fontKey, uint16_t cacheType) 69a3e0fd82Sopenharmony_ci{ 70a3e0fd82Sopenharmony_ci if (!hasInit_) { 71a3e0fd82Sopenharmony_ci return nullptr; 72a3e0fd82Sopenharmony_ci } 73a3e0fd82Sopenharmony_ci 74a3e0fd82Sopenharmony_ci GlyphCacheNode* node = nullptr; 75a3e0fd82Sopenharmony_ci 76a3e0fd82Sopenharmony_ci uint8_t font = (fontKey ^ unicode) & FONT_HASH_MASK; 77a3e0fd82Sopenharmony_ci uint8_t uc = unicode & UNICODE_HASH_MASK; 78a3e0fd82Sopenharmony_ci for (uint8_t i = 0; i < NODE_HASH_NR; i++) { 79a3e0fd82Sopenharmony_ci GlyphCacheNode* p = &((*nodeCache_)[font][uc][i]); 80a3e0fd82Sopenharmony_ci if ((p->node.unicode == unicode) && (p->node.fontId == fontKey)) { 81a3e0fd82Sopenharmony_ci if (!cacheType || p->cacheType == cacheType) { 82a3e0fd82Sopenharmony_ci node = p; 83a3e0fd82Sopenharmony_ci break; 84a3e0fd82Sopenharmony_ci } 85a3e0fd82Sopenharmony_ci } 86a3e0fd82Sopenharmony_ci } 87a3e0fd82Sopenharmony_ci return node; 88a3e0fd82Sopenharmony_ci} 89a3e0fd82Sopenharmony_ci 90a3e0fd82Sopenharmony_ciGlyphCacheNode* GlyphsCache::GetNodeCacheSpace(uint32_t unicode, uint16_t fontKey) 91a3e0fd82Sopenharmony_ci{ 92a3e0fd82Sopenharmony_ci if (!hasInit_) { 93a3e0fd82Sopenharmony_ci return nullptr; 94a3e0fd82Sopenharmony_ci } 95a3e0fd82Sopenharmony_ci 96a3e0fd82Sopenharmony_ci uint8_t font = (fontKey ^ unicode) & FONT_HASH_MASK; 97a3e0fd82Sopenharmony_ci uint8_t uc = unicode & UNICODE_HASH_MASK; 98a3e0fd82Sopenharmony_ci uint8_t i = (*cacheStatus_)[font][uc]; 99a3e0fd82Sopenharmony_ci GlyphCacheNode* node = &((*nodeCache_)[font][uc][i]); 100a3e0fd82Sopenharmony_ci 101a3e0fd82Sopenharmony_ci i++; 102a3e0fd82Sopenharmony_ci if (i >= NODE_HASH_NR) { 103a3e0fd82Sopenharmony_ci i = 0; 104a3e0fd82Sopenharmony_ci } 105a3e0fd82Sopenharmony_ci (*cacheStatus_)[font][uc] = i; 106a3e0fd82Sopenharmony_ci 107a3e0fd82Sopenharmony_ci return node; 108a3e0fd82Sopenharmony_ci} 109a3e0fd82Sopenharmony_ci} // namespace OHOS 110