13920e296Sopenharmony_ci/* 23920e296Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 33920e296Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43920e296Sopenharmony_ci * you may not use this file except in compliance with the License. 53920e296Sopenharmony_ci * You may obtain a copy of the License at 63920e296Sopenharmony_ci * 73920e296Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83920e296Sopenharmony_ci * 93920e296Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103920e296Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113920e296Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123920e296Sopenharmony_ci * See the License for the specific language governing permissions and 133920e296Sopenharmony_ci * limitations under the License. 143920e296Sopenharmony_ci */ 153920e296Sopenharmony_ci 163920e296Sopenharmony_ci#ifndef OHOS_RESTOOL_COMPRESSION_PARSER_H 173920e296Sopenharmony_ci#define OHOS_RESTOOL_COMPRESSION_PARSER_H 183920e296Sopenharmony_ci 193920e296Sopenharmony_ci#include <chrono> 203920e296Sopenharmony_ci#include <cJSON.h> 213920e296Sopenharmony_ci#ifdef __WIN32 223920e296Sopenharmony_ci#include <windows.h> 233920e296Sopenharmony_ci#else 243920e296Sopenharmony_ci#include <dlfcn.h> 253920e296Sopenharmony_ci#endif 263920e296Sopenharmony_ci#include "resource_util.h" 273920e296Sopenharmony_ci 283920e296Sopenharmony_cinamespace OHOS { 293920e296Sopenharmony_cinamespace Global { 303920e296Sopenharmony_cinamespace Restool { 313920e296Sopenharmony_ci 323920e296Sopenharmony_cienum class TranscodeError { 333920e296Sopenharmony_ci SUCCESS = 0, 343920e296Sopenharmony_ci INVALID_PARAMETERS, 353920e296Sopenharmony_ci IMAGE_ERROR, 363920e296Sopenharmony_ci ANIMATED_IMAGE_SKIP, 373920e296Sopenharmony_ci MALLOC_FAILED, 383920e296Sopenharmony_ci ENCODE_ASTC_FAILED, 393920e296Sopenharmony_ci SUPER_COMPRESS_FAILED, 403920e296Sopenharmony_ci NOT_MATCH_BASE = 100, 413920e296Sopenharmony_ci IMAGE_SIZE_NOT_MATCH = 100, 423920e296Sopenharmony_ci IMAGE_RESOLUTION_NOT_MATCH, 433920e296Sopenharmony_ci EXCLUDE_MATCH, 443920e296Sopenharmony_ci NOT_MATCH_BUTT = 199, 453920e296Sopenharmony_ci LOAD_COMPRESS_FAILED 463920e296Sopenharmony_ci}; 473920e296Sopenharmony_ci 483920e296Sopenharmony_cistruct TranscodeResult { 493920e296Sopenharmony_ci size_t originSize; 503920e296Sopenharmony_ci int32_t size; 513920e296Sopenharmony_ci int32_t width; 523920e296Sopenharmony_ci int32_t height; 533920e296Sopenharmony_ci}; 543920e296Sopenharmony_ci 553920e296Sopenharmony_cistruct ImageSize { 563920e296Sopenharmony_ci size_t width; 573920e296Sopenharmony_ci size_t height; 583920e296Sopenharmony_ci}; 593920e296Sopenharmony_ci 603920e296Sopenharmony_citypedef TranscodeError (*ITranscodeImages) (const std::string &imagePath, const bool extAppend, 613920e296Sopenharmony_ci std::string &outputPath, TranscodeResult &result); 623920e296Sopenharmony_citypedef bool (*ISetTranscodeOptions) (const std::string &optionJson, const std::string &optionJsonExclude); 633920e296Sopenharmony_citypedef TranscodeError (*IScaleImage) (const std::string &imagePath, std::string &outputPath, ImageSize size); 643920e296Sopenharmony_ci 653920e296Sopenharmony_ciclass CompressionParser { 663920e296Sopenharmony_cipublic: 673920e296Sopenharmony_ci static std::shared_ptr<CompressionParser> GetCompressionParser(const std::string &filePath); 683920e296Sopenharmony_ci static std::shared_ptr<CompressionParser> GetCompressionParser(); 693920e296Sopenharmony_ci CompressionParser(); 703920e296Sopenharmony_ci explicit CompressionParser(const std::string &filePath); 713920e296Sopenharmony_ci virtual ~CompressionParser(); 723920e296Sopenharmony_ci uint32_t Init(); 733920e296Sopenharmony_ci bool CopyAndTranscode(const std::string &src, std::string &dst, const bool extAppend = false); 743920e296Sopenharmony_ci bool GetMediaSwitch(); 753920e296Sopenharmony_ci std::string PrintTransMessage(); 763920e296Sopenharmony_ci bool GetDefaultCompress(); 773920e296Sopenharmony_ci void SetOutPath(const std::string &path); 783920e296Sopenharmony_ci bool ScaleIconEnable(); 793920e296Sopenharmony_ci bool CheckAndScaleIcon(const std::string &src, const std::string &originDst, std::string &scaleDst); 803920e296Sopenharmony_ciprivate: 813920e296Sopenharmony_ci bool ParseContext(const cJSON *contextNode); 823920e296Sopenharmony_ci bool ParseCompression(const cJSON *compressionNode); 833920e296Sopenharmony_ci bool ParseFilters(const cJSON *filtersNode); 843920e296Sopenharmony_ci bool LoadImageTranscoder(); 853920e296Sopenharmony_ci bool SetTranscodeOptions(const std::string &optionJson, const std::string &optionJsonExclude); 863920e296Sopenharmony_ci TranscodeError TranscodeImages(const std::string &imagePath, const bool extAppend, 873920e296Sopenharmony_ci std::string &outputPath, TranscodeResult &result); 883920e296Sopenharmony_ci TranscodeError ScaleImage(const std::string &imagePath, std::string &outputPath); 893920e296Sopenharmony_ci std::vector<std::string> ParsePath(const cJSON *pathNode); 903920e296Sopenharmony_ci std::string ParseRules(const cJSON *rulesNode); 913920e296Sopenharmony_ci std::string ParseJsonStr(const cJSON *node); 923920e296Sopenharmony_ci bool CheckPath(const std::string &src, const std::vector<std::string> &paths); 933920e296Sopenharmony_ci bool IsInPath(const std::string &src, const std::shared_ptr<CompressFilter> &compressFilter); 943920e296Sopenharmony_ci bool IsInExcludePath(const std::string &src, const std::shared_ptr<CompressFilter> &compressFilter); 953920e296Sopenharmony_ci void CollectTime(uint32_t &count, unsigned long long &time, 963920e296Sopenharmony_ci std::chrono::time_point<std::chrono::steady_clock> &start); 973920e296Sopenharmony_ci void CollectTimeAndSize(TranscodeError res, std::chrono::time_point<std::chrono::steady_clock> &start, 983920e296Sopenharmony_ci TranscodeResult &result); 993920e296Sopenharmony_ci std::string GetMethod(const std::shared_ptr<CompressFilter> &compressFilter); 1003920e296Sopenharmony_ci std::string GetRules(const std::shared_ptr<CompressFilter> &compressFilter); 1013920e296Sopenharmony_ci std::string GetExcludeRules(const std::shared_ptr<CompressFilter> &compressFilter); 1023920e296Sopenharmony_ci std::string GetFileRules(const std::string &rules, const std::string &method); 1033920e296Sopenharmony_ci bool CheckAndTranscode(const std::string &src, std::string &dst, std::string &output, 1043920e296Sopenharmony_ci const std::shared_ptr<CompressFilter> &compressFilter, const bool extAppend); 1053920e296Sopenharmony_ci bool CopyForTrans(const std::string &src, const std::string &originDst, const std::string &dst); 1063920e296Sopenharmony_ci bool IsDefaultCompress(); 1073920e296Sopenharmony_ci std::string filePath_; 1083920e296Sopenharmony_ci std::string extensionPath_; 1093920e296Sopenharmony_ci std::vector<std::shared_ptr<CompressFilter>> compressFilters_; 1103920e296Sopenharmony_ci bool mediaSwitch_; 1113920e296Sopenharmony_ci cJSON *root_; 1123920e296Sopenharmony_ci bool defaultCompress_; 1133920e296Sopenharmony_ci std::string outPath_; 1143920e296Sopenharmony_ci unsigned long long totalTime_ = 0; 1153920e296Sopenharmony_ci uint32_t totalCounts_ = 0; 1163920e296Sopenharmony_ci unsigned long long compressTime_ = 0; 1173920e296Sopenharmony_ci uint32_t compressCounts_ = 0; 1183920e296Sopenharmony_ci unsigned long long successTime_ = 0; 1193920e296Sopenharmony_ci uint32_t successCounts_ = 0; 1203920e296Sopenharmony_ci unsigned long long originalSize_ = 0; 1213920e296Sopenharmony_ci unsigned long long successSize_ = 0; 1223920e296Sopenharmony_ci#ifdef __WIN32 1233920e296Sopenharmony_ci HMODULE handle_ = nullptr; 1243920e296Sopenharmony_ci#else 1253920e296Sopenharmony_ci void *handle_ = nullptr; 1263920e296Sopenharmony_ci#endif 1273920e296Sopenharmony_ci}; 1283920e296Sopenharmony_ci} 1293920e296Sopenharmony_ci} 1303920e296Sopenharmony_ci} 1313920e296Sopenharmony_ci#endif