From 9177756653206754c46df23d576cb1a3a49eaa09 Mon Sep 17 00:00:00 2001 From: Andrei Kochin Date: Thu, 3 Oct 2024 12:47:41 +0400 Subject: [PATCH 01/42] convert.py script deprecation and llm-bench README update (#916) To avoid confusions like #909 --------- Co-authored-by: Ravi Panchumarthy Co-authored-by: Ekaterina Aidova --- llm_bench/python/README.md | 203 ++++++++++++++++++++---------------- llm_bench/python/convert.py | 1 + 2 files changed, 115 insertions(+), 89 deletions(-) diff --git a/llm_bench/python/README.md b/llm_bench/python/README.md index b49ad980ab..3ef58f113a 100755 --- a/llm_bench/python/README.md +++ b/llm_bench/python/README.md @@ -1,140 +1,165 @@ -# Benchmarking script for large language models +# Benchmarking Script for Large Language Models -This script provides a unified approach to estimate performance for Large Language Models. -It is based on pipelines provided by Optimum-Intel and allows to estimate performance for -pytorch and openvino models, using almost the same code and precollected models. +This script provides a unified approach to estimate performance for Large Language Models (LLMs). It leverages pipelines provided by Optimum-Intel and allows performance estimation for PyTorch and OpenVINO models using nearly identical code and pre-collected models. -## Usage -### 1. Start a Python virtual environment +### 1. Prepare Python Virtual Environment for LLM Benchmarking ``` bash -python3 -m venv python-env -source python-env/bin/activate +python3 -m venv ov-llm-bench-env +source ov-llm-bench-env/bin/activate pip install --upgrade pip -pip install -r requirements.txt + +git clone https://github.com/openvinotoolkit/openvino.genai.git +cd openvino.genai/llm_bench/python/ +pip install -r requirements.txt ``` -> Note: -> If you are using an existing python environment, recommend following command to use all the dependencies with latest versions: -> pip install -U --upgrade-strategy eager -r requirements.txt -### 2. Convert a model to OpenVINO IR - -The optimum-cli tool allows you to convert models from Hugging Face to the OpenVINO IR format. More detailed info about tool usage can be found in [Optimum Intel documentation](https://huggingface.co/docs/optimum/main/en/intel/openvino/export) +> Note: +> For existing Python environments, run the following command to ensure that all dependencies are installed with the latest versions: +> `pip install -U --upgrade-strategy eager -r requirements.txt` -Prerequisites: -install conversion dependencies using `requirements.txt` +#### (Optional) Hugging Face Login : -Usage: +Login to Hugging Face if you want to use non-public models: ```bash -optimum-cli export openvino --model --weight-format +huggingface-cli login ``` -Paramters: -* `--model ` - model_id for downloading from huggngface_hub (https://huggingface.co/models) or path with directory where pytorch model located. -* `--weight-format` - precision for model conversion fp32, fp16, int8, int4 -* `` - output directory for saving OpenVINO model. +### 2. Convert Model to OpenVINO IR Format + +The `optimum-cli` tool simplifies converting Hugging Face models to OpenVINO IR format. +- Detailed documentation can be found in the [Optimum-Intel documentation](https://huggingface.co/docs/optimum/main/en/intel/openvino/export). +- To learn more about weight compression, see the [NNCF Weight Compression Guide](https://docs.openvino.ai/2024/openvino-workflow/model-optimization-guide/weight-compression.html). +- For additional guidance on running inference with OpenVINO for LLMs, see the [OpenVINO LLM Inference Guide](https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide.html). -Usage example: -```bash -optimum-cli export openvino --model meta-llama/Llama-2-7b-chat-hf --weight-format fp16 models/llama-2-7b-chat -``` +**Usage:** -the result of running the command will have the following file structure: +```bash +optimum-cli export openvino --model --weight-format - |-llama-2-7b-chat - |-pytorch - |-dldt - |-FP16 - |-openvino_model.xml - |-openvino_model.bin - |-config.json - |-generation_config.json - |-tokenizer_config.json - |-tokenizer.json - |-tokenizer.model - |-special_tokens_map.json +optimum-cli export openvino -h # For detailed information +``` -### 3. Benchmarking +* `--model ` : model_id for downloading from [huggngface_hub](https://huggingface.co/models) or path with directory where pytorch model located. +* `--weight-format ` : precision for model conversion. Available options: `fp32, fp16, int8, int4, mxfp4` +* ``: output directory for saving generated OpenVINO model. -Prerequisites: -install benchmarking dependencies using `requirements.txt` +**NOTE:** +- Models larger than 1 billion parameters are exported to the OpenVINO format with 8-bit weights by default. You can disable it with `--weight-format fp32`. -``` bash -pip install -r requirements.txt +**Example:** +```bash +optimum-cli export openvino --model meta-llama/Llama-2-7b-chat-hf --weight-format fp16 models/llama-2-7b-chat ``` -note: **You can specify the installed OpenVINO version through pip install** -``` bash -# e.g. -pip install openvino==2023.3.0 +**Resulting file structure:** + +```console + models + └── llama-2-7b-chat + ├── config.json + ├── generation_config.json + ├── openvino_detokenizer.bin + ├── openvino_detokenizer.xml + ├── openvino_model.bin + ├── openvino_model.xml + ├── openvino_tokenizer.bin + ├── openvino_tokenizer.xml + ├── special_tokens_map.json + ├── tokenizer_config.json + ├── tokenizer.json + └── tokenizer.model ``` -### 4. Run the following command to test the performance of one LLM model +### 3. Benchmark LLM Model + +To benchmark the performance of the LLM, use the following command: + ``` bash python benchmark.py -m -d -r -f -p -n # e.g. -python benchmark.py -m models/llama-2-7b-chat/pytorch/dldt/FP32 -n 2 -python benchmark.py -m models/llama-2-7b-chat/pytorch/dldt/FP32 -p "What is openvino?" -n 2 -python benchmark.py -m models/llama-2-7b-chat/pytorch/dldt/FP32 -pf prompts/llama-2-7b-chat_l.jsonl -n 2 +python benchmark.py -m models/llama-2-7b-chat/ -n 2 +python benchmark.py -m models/llama-2-7b-chat/ -p "What is openvino?" -n 2 +python benchmark.py -m models/llama-2-7b-chat/ -pf prompts/llama-2-7b-chat_l.jsonl -n 2 ``` -Parameters: -* `-m` - model path -* `-d` - inference device (default=cpu) -* `-r` - report csv -* `-f` - framework (default=ov) -* `-p` - interactive prompt text -* `-pf` - path of JSONL file including interactive prompts -* `-n` - number of benchmarking iterations, if the value greater 0, will exclude the first iteration. (default=0) -* `-ic` - limit the output token size (default 512) of text_gen and code_gen models. - +**Parameters:** +- `-m`: Path to the model. +- `-d`: Inference device (default: CPU). +- `-r`: Path to the CSV report. +- `-f`: Framework (default: ov). +- `-p`: Interactive prompt text. +- `-pf`: Path to a JSONL file containing prompts. +- `-n`: Number of iterations (default: 0, the first iteration is excluded). +- `-ic`: Limit the output token size (default: 512) for text generation and code generation models. + +**Additional options:** ``` bash python ./benchmark.py -h # for more information ``` -## Running `torch.compile()` +#### Benchmarking the Original PyTorch Model: +To benchmark the original PyTorch model, first download the model locally and then run benchmark by specifying PyTorch as the framework with parameter `-f pt` -The option `--torch_compile_backend` uses `torch.compile()` to speed up -the PyTorch code by compiling it into optimized kernels using a selected backend. +```bash +# Download PyTorch Model +huggingface-cli download meta-llama/Llama-2-7b-chat-hf --local-dir models/llama-2-7b-chat/pytorch +# Benchmark with PyTorch Framework +python benchmark.py -m models/llama-2-7b-chat/pytorch -n 2 -f pt +``` -Prerequisites: install benchmarking dependencies using requirements.txt +> **Note:** If needed, You can install a specific OpenVINO version using pip: +> ``` bash +> # e.g. +> pip install openvino==2024.4.0 +> # Optional, install the openvino nightly package if needed. +> # OpenVINO nightly is pre-release software and has not undergone full release validation or qualification. +> pip uninstall openvino +> pip install --upgrade --pre openvino openvino-tokenizers --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly +> ``` -``` bash -pip install -r requirements.txt -``` +## 4. Benchmark LLM with `torch.compile()` + +The `--torch_compile_backend` option enables you to use `torch.compile()` to accelerate PyTorch models by compiling them into optimized kernels using a specified backend. -In order to run the `torch.compile()` on CUDA GPU, install additionally the nightly PyTorch version: +Before benchmarking, you need to download the original PyTorch model. Use the following command to download the model locally: ```bash -pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu118 +huggingface-cli download meta-llama/Llama-2-7b-chat-hf --local-dir models/llama-2-7b-chat/pytorch ``` -Add the option `--torch_compile_backend` with the desired backend: `pytorch` or `openvino` (default) while running the benchmarking script: +To run the benchmarking script with `torch.compile()`, use the `--torch_compile_backend` option to specify the backend. You can choose between `pytorch` or `openvino` (default). Example: ```bash python ./benchmark.py -m models/llama-2-7b-chat/pytorch -d CPU --torch_compile_backend openvino ``` -## Run on 2 sockets platform +> **Note:** To use `torch.compile()` with CUDA GPUs, you need to install the nightly version of PyTorch: +> +> ```bash +> pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu118 +> ``` + -benchmark.py sets openvino.properties.streams.num(1) by default +## 5. Running on 2-Socket Platforms -| OpenVINO version | Behaviors | +The benchmarking script sets `openvino.properties.streams.num(1)` by default. For multi-socket platforms, use `numactl` on Linux or the `--load_config` option to modify behavior. + +| OpenVINO Version | Behaviors | |:--------------------|:------------------------------------------------| -| Before 2024.0.0 | streams.num(1)
execute on 2 sockets. | -| 2024.0.0 | streams.num(1)
execute on the same socket as the APP is running on. | +| Before 2024.0.0 | streams.num(1)
execute on 2 sockets. | +| 2024.0.0 | streams.num(1)
execute on the same socket as the APP is running on. | -numactl on Linux or --load_config for benchmark.py can be used to change the behaviors. +For example, `--load_config config.json` as following will result in streams.num(1) and execute on 2 sockets. +```json +{ + "INFERENCE_NUM_THREADS": +} +``` +`` is the number of total physical cores in 2 sockets. -For example, --load_config config.json as following in OpenVINO 2024.0.0 will result in streams.num(1) and execute on 2 sockets. -``` -{"INFERENCE_NUM_THREADS":} -``` -`` is the number of total physical cores in 2 sockets +## 6. Additional Resources -## Additional Resources -### 1. NOTE -> If you encounter any errors, please check **[NOTES.md](./doc/NOTES.md)** which provides solutions to the known errors. -### 2. Image generation -> To configure more parameters for image generation models, reference to **[IMAGE_GEN.md](./doc/IMAGE_GEN.md)** +- **Error Troubleshooting:** Check the [NOTES.md](./doc/NOTES.md) for solutions to known issues. +- **Image Generation Configuration:** Refer to [IMAGE_GEN.md](./doc/IMAGE_GEN.md) for setting parameters for image generation models. \ No newline at end of file diff --git a/llm_bench/python/convert.py b/llm_bench/python/convert.py index ae676bc269..9d4d05fb99 100644 --- a/llm_bench/python/convert.py +++ b/llm_bench/python/convert.py @@ -1464,6 +1464,7 @@ def main(): add_stateful_model_arguments(parser) args = parser.parse_args() + log.warning("[DEPRECATED] Not for production use! Please use the 'optimum-intel' to generate the IRs. For details, please check: https://github.com/openvinotoolkit/openvino.genai/blob/master/llm_bench/python/README.md#2-convert-model-to-openvino-ir-format") log.info(f"openvino runtime version: {get_version()}") model_type = get_convert_model_type(args.model_id.lower()) converter = converters[model_type] From b11f0d9a4910da88e771ae2b467b67e91c7986d6 Mon Sep 17 00:00:00 2001 From: Anatoliy Talamanov Date: Mon, 7 Oct 2024 11:00:48 +0200 Subject: [PATCH 02/42] StaticLLMPipeline: Enable DQ (#878) --- src/cpp/src/llm_pipeline_static.cpp | 73 ++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/src/cpp/src/llm_pipeline_static.cpp b/src/cpp/src/llm_pipeline_static.cpp index 0c75ad30b4..e330693c5d 100644 --- a/src/cpp/src/llm_pipeline_static.cpp +++ b/src/cpp/src/llm_pipeline_static.cpp @@ -52,6 +52,36 @@ void align_u4_zp_constants(const std::shared_ptr& model) { } } +bool allow_to_enable_npuw_dq(const std::shared_ptr& model) { + std::vector rt_info_path = {"nncf", "weight_compression", "group_size"}; + if (!model->has_rt_info(rt_info_path)) { + // NB: Model isn't compressed by NNCF - skip + return false; + } + auto group_size = model->get_rt_info(rt_info_path); + if (group_size == -1) { + // NB: Enable DQ for CW quantized models + return true; + } + return false; +} + +std::optional pop_option(ov::AnyMap& config, const std::string& option_name) { + if (auto it = config.find(option_name); it != config.end()) { + config.erase(it); + return std::make_optional(it->second); + } + return std::nullopt; +} + +void enable_npuw_dq_if_allowed(ov::AnyMap& config, + const std::shared_ptr& model) { + if (allow_to_enable_npuw_dq(model)) { + config["NPUW_DQ"] = "YES"; + pop_option(config, "NPUW_ONLINE_AVOID"); + } +} + std::shared_ptr redirect_new_kv_to_output(const std::shared_ptr& model) { const auto kStartOutputKVCacheLayers = 1u; for (int i = kStartOutputKVCacheLayers; i < model->outputs().size(); ++i) { @@ -182,19 +212,22 @@ void merge_config_with(ov::AnyMap& lhs, const ov::AnyMap& rhs) { } } -ov::AnyMap get_default_prefill_config() { - std::map config = { +ov::AnyMap get_default_prefill_config(const std::shared_ptr& model) { + ov::AnyMap config = { { "NPU_USE_NPUW", "YES" }, { "NPUW_FOLD", "YES" }, { "NPUW_DCOFF_TYPE", "f16" }, { "NPUW_DCOFF_SCALE", "YES" }, + { "NPUW_WEIGHTS_BANK", "shared" }, + { "NPU_COMPILATION_MODE_PARAMS", "compute-layers-with-higher-precision=Sqrt,Power,ReduceMean,Add" }, { "NPUW_ONLINE_AVOID", "P:RMSNorm/NPU" } }; - return { config.begin(), config.end() }; + enable_npuw_dq_if_allowed(config, model); + return config; } -ov::AnyMap get_default_generate_config() { - std::map config = { +ov::AnyMap get_default_generate_config(const std::shared_ptr& model) { + ov::AnyMap config = { { "NPU_USE_NPUW", "YES" }, { "NPUW_FOLD", "YES" }, { "NPUW_DCOFF_TYPE", "f16" }, @@ -202,17 +235,18 @@ ov::AnyMap get_default_generate_config() { { "NPU_COMPILATION_MODE_PARAMS", "compute-layers-with-higher-precision=Sqrt,Power,ReduceMean,Add" }, { "NPUW_PARALLEL_COMPILE", "YES" }, { "NPUW_FUNCALL_ASYNC", "YES" }, + { "NPUW_WEIGHTS_BANK", "shared" }, { "NPUW_ONLINE_AVOID", "P:RMSNorm/NPU" } }; - return { config.begin(), config.end() }; + enable_npuw_dq_if_allowed(config, model); + return config; } template T pop_or_default(ov::AnyMap& config, const std::string& key, const T& default_value) { - if (auto it = config.find(key); it != config.end()) { - auto value = it->second; - config.erase(it); - return value.as(); + auto anyopt = pop_option(config, key); + if (anyopt.has_value()) { + return anyopt.value().as(); } return default_value; } @@ -227,9 +261,7 @@ ov::Tensor make_tensor_slice(ov::Tensor tensor, size_t dim, size_t start_pos, si void drop_cache_dir(ov::AnyMap& config) { if (config.count("NPU_USE_NPUW") != 0u) { - if (auto it = config.find("CACHE_DIR"); it != config.end()) { - config.erase(it); - } + pop_option(config, "CACHE_DIR"); } } @@ -312,13 +344,18 @@ void StaticLLMPipeline::setupAndCompileModels( reshape_to_static(m_prefill_model, m_kvcache_desc.max_prompt_size, m_kvcache_desc.max_prompt_size, axes); reshape_to_static(m_kvcache_model, 1u, m_kvcache_desc.total_size, axes); // (8) Compile both model - auto prefill_config = pop_or_default(pipeline_config, "PREFILL_CONFIG", get_default_prefill_config()); - auto generate_config = pop_or_default(pipeline_config, "GENERATE_CONFIG", get_default_generate_config()); + auto prefill_config = pop_or_default( + pipeline_config, "PREFILL_CONFIG", get_default_prefill_config(m_prefill_model) + ); + auto generate_config = pop_or_default( + pipeline_config, "GENERATE_CONFIG", get_default_generate_config(m_kvcache_model) + ); merge_config_with(prefill_config, pipeline_config); merge_config_with(generate_config, pipeline_config); // FIXME: Drop CACHE_DIR option if NPUW is enabled drop_cache_dir(prefill_config); drop_cache_dir(generate_config); + m_prefill_request = core.compile_model( m_prefill_model, device, prefill_config ).create_infer_request(); @@ -342,7 +379,7 @@ void StaticLLMPipeline::setupAndImportModels( */ ov::Core core; - auto import_blob = [this, + auto import_blob = [this, &path, &pipeline_config, &core, @@ -397,8 +434,8 @@ void StaticLLMPipeline::setupAndImportModels( // (4) Fill in m_kvcache_desc const uint32_t kMaxPromptLen = get_kvcache_size(prefill_model); const uint32_t kMinResponseLen = get_kvcache_size(generate_model) - kMaxPromptLen; - // FIXME For some models KV-cache dim != 2u - m_kvcache_desc = KVCacheDesc { kMaxPromptLen, kMaxPromptLen + kMinResponseLen, 0u, 2u }; + // FIXME For some models KV-cache dim != 2u + m_kvcache_desc = KVCacheDesc { kMaxPromptLen, kMaxPromptLen + kMinResponseLen, 0u, 2u }; } void StaticLLMPipeline::start_chat(const std::string& system_message) { From 41f1e7bb2b9b9c30e8d2d0181ecc644701d2631c Mon Sep 17 00:00:00 2001 From: Sergey Lyalin Date: Mon, 7 Oct 2024 15:41:56 +0400 Subject: [PATCH 03/42] LoRA in Text2ImagePipeline (#911) Co-authored-by: Ilya Lavrenov --- .github/workflows/lcm_dreamshaper_cpp.yml | 4 +- .../workflows/stable_diffusion_1_5_cpp.yml | 15 +++- README.md | 2 +- samples/CMakeLists.txt | 6 +- samples/cpp/stable_diffusion/README.md | 48 ----------- .../512x512.bmp | Bin .../CMakeLists.txt | 21 ++++- samples/cpp/text2image/README.md | 76 ++++++++++++++++++ samples/cpp/text2image/baseline.bmp | Bin 0 -> 1376310 bytes .../imwrite.cpp | 0 .../imwrite.hpp | 0 samples/cpp/text2image/lora.bmp | Bin 0 -> 1376310 bytes samples/cpp/text2image/lora.cpp | 53 ++++++++++++ .../{stable_diffusion => text2image}/main.cpp | 0 .../openvino/genai/generation_config.hpp | 2 - .../include/openvino/genai/lora_adapter.hpp | 14 ++-- .../genai/text2image/clip_text_model.hpp | 4 + .../openvino/genai/text2image/pipeline.hpp | 10 +++ .../text2image/unet2d_condition_model.hpp | 4 + src/cpp/src/llm_pipeline.cpp | 9 +-- src/cpp/src/lora_adapter.cpp | 64 +++++++-------- src/cpp/src/lora_helper.cpp | 28 +++++++ src/cpp/src/lora_helper.hpp | 21 +++++ .../src/text2image/models/autoencoder_kl.cpp | 7 +- .../src/text2image/models/clip_text_model.cpp | 13 ++- .../models/unet2d_condition_model.cpp | 13 ++- .../text2image/stable_diffusion_pipeline.hpp | 6 ++ .../src/text2image/text2image_pipeline.cpp | 9 ++- 28 files changed, 318 insertions(+), 111 deletions(-) delete mode 100644 samples/cpp/stable_diffusion/README.md rename samples/cpp/{stable_diffusion => text2image}/512x512.bmp (100%) rename samples/cpp/{stable_diffusion => text2image}/CMakeLists.txt (56%) create mode 100644 samples/cpp/text2image/README.md create mode 100644 samples/cpp/text2image/baseline.bmp rename samples/cpp/{stable_diffusion => text2image}/imwrite.cpp (100%) rename samples/cpp/{stable_diffusion => text2image}/imwrite.hpp (100%) create mode 100644 samples/cpp/text2image/lora.bmp create mode 100644 samples/cpp/text2image/lora.cpp rename samples/cpp/{stable_diffusion => text2image}/main.cpp (100%) create mode 100644 src/cpp/src/lora_helper.cpp create mode 100644 src/cpp/src/lora_helper.hpp diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index cd31ae497d..7997616c6e 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -67,7 +67,7 @@ jobs: - name: Run app run: | source ${{ env.OV_INSTALL_DIR }}/setupvars.sh - ./build/samples/cpp/stable_diffusion/stable_diffusion ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + ./build/samples/cpp/text2image/stable_diffusion ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" lcm_dreamshaper_v7_cpp-windows: runs-on: windows-latest @@ -118,7 +118,7 @@ jobs: - name: Run app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - ./build/samples/cpp/stable_diffusion/Release/lcm_dreamshaper.exe ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + ./build/samples/cpp/text2image/Release/lcm_dreamshaper.exe ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" Overall_Status: name: ci/gha_overall_status_lcm diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index c69287678d..1f0e11851b 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -64,10 +64,19 @@ jobs: source openvino_sd_cpp/bin/activate optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --weight-format fp16 --task stable-diffusion models/dreamlike-art-dreamlike-anime-1.0/FP16 - - name: Run app + - name: Run main app run: | source ${{ env.OV_INSTALL_DIR }}/setupvars.sh - ./build/samples/cpp/stable_diffusion/stable_diffusion ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + ./build/samples/cpp/text2image/stable_diffusion ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + + - name: Download LoRA adapter + run: | + wget -O ./models/soulcard.safetensors https://civitai.com/api/download/models/72591 + + - name: Run LoRA app + run: | + source ${{ env.OV_INSTALL_DIR }}/setupvars.sh + ./build/samples/cpp/text2image/lora_stable_diffusion ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 stable_diffusion_1_5_cpp-windows: runs-on: windows-latest @@ -118,7 +127,7 @@ jobs: - name: Run app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - ./build/samples/cpp/stable_diffusion/Release/stable_diffusion.exe ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + ./build/samples/cpp/text2image/Release/stable_diffusion.exe ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" Overall_Status: name: ci/gha_overall_status_stable_diffusion diff --git a/README.md b/README.md index f20ae1c268..6a7c325f69 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ It includes the following pipelines: 6. [multinomial_causal_lm](./samples/cpp/multinomial_causal_lm/README.md) 7. [prompt_lookup_decoding_lm](./samples/cpp/prompt_lookup_decoding_lm/README.md) 8. [speculative_decoding_lm](./samples/cpp/speculative_decoding_lm/README.md) -3. [Stable Diffuison and Latent Consistency Model (with LoRA) C++ image generation pipeline](./samples/cpp/stable_diffusion/README.md) +3. [Stable Diffuison and Latent Consistency Model (with LoRA) C++ image generation pipeline](./samples/cpp/text2image/README.md) ### Requirements diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index c0e268bd9c..9add86a3d7 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -13,7 +13,7 @@ add_subdirectory(cpp/prompt_lookup_decoding_lm) add_subdirectory(cpp/speculative_decoding_lm) add_subdirectory(cpp/benchmark_genai) add_subdirectory(cpp/whisper_speech_recognition) -add_subdirectory(cpp/stable_diffusion) +add_subdirectory(cpp/text2image) install(FILES requirements.txt DESTINATION samples COMPONENT cpp_samples_genai) @@ -26,7 +26,7 @@ install(DIRECTORY # Don't install prompt_lookup_decoding_lm and speculative_decoding_lm because they don't use openvino_genai library and arent verifyed yet. # Don't install continuous_batching_accuracy and continuous_batching_benchmark because they depend on json. cpp/whisper_speech_recognition - cpp/stable_diffusion + cpp/text2image cpp/lora_greedy_causal_lm DESTINATION samples/cpp COMPONENT cpp_samples_genai) @@ -36,6 +36,6 @@ install(DIRECTORY python/greedy_causal_lm python/multinomial_causal_lm python/whisper_speech_recognition - # python/stable_diffusion + # python/text2image DESTINATION samples/python COMPONENT cpp_samples_genai USE_SOURCE_PERMISSIONS) diff --git a/samples/cpp/stable_diffusion/README.md b/samples/cpp/stable_diffusion/README.md deleted file mode 100644 index 5e6bfd0f9d..0000000000 --- a/samples/cpp/stable_diffusion/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# Stable Diffusion C++ Image Generation Pipeline - -This example showcases inference of text to image models like Stable Diffusion 1.5, 2.1, LCM. The application doesn't have many configuration options to encourage the reader to explore and modify the source code. For example, change the device for inference to GPU. The sample features `ov::genai::Text2ImagePipeline` and uses a text prompt as input source. - -Users can change the sample code and play with the following generation parameters: - -- Change width or height of generated image -- Generate multiple images per prompt -- Adjust a number of inference steps -- Play with [guidance scale](https://huggingface.co/spaces/stabilityai/stable-diffusion/discussions/9) (read [more details](https://arxiv.org/abs/2207.12598)) -- (SD 1.x, 2.x only) Add negative prompt when guidance scale > 1 - -## Download and convert the models and tokenizers - -The `--upgrade-strategy eager` option is needed to ensure `optimum-intel` is upgraded to the latest version. - -It's not required to install [../../requirements.txt](../../requirements.txt) for deployment if the model has already been exported. - -```sh -pip install --upgrade-strategy eager -r ../../requirements.txt -optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --task stable-diffusion --weight-format fp16 dreamlike_anime_1_0_ov/FP16 -``` - -## Run - -`stable_diffusion ./dreamlike_anime_1_0_ov/FP16 'cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting'` - -### Examples - -Prompt: `cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting` - - ![](./512x512.bmp) - -## Supported models - -Models can be downloaded from [OpenAI HiggingFace](https://huggingface.co/openai). This sample can run the following list of models, but not limitied to: - -- [botp/stable-diffusion-v1-5](https://huggingface.co/botp/stable-diffusion-v1-5) -- [stabilityai/stable-diffusion-2](https://huggingface.co/stabilityai/stable-diffusion-2) -- [stabilityai/stable-diffusion-2-1](https://huggingface.co/stabilityai/stable-diffusion-2-1) -- [dreamlike-art/dreamlike-anime-1.0](https://huggingface.co/dreamlike-art/dreamlike-anime-1.0) -- [SimianLuo/LCM_Dreamshaper_v7](https://huggingface.co/SimianLuo/LCM_Dreamshaper_v7) - -## Note - -- Image generated with HuggingFace / Optimum Intel is not the same generated by this C++ sample: - -C++ random generation with MT19937 results differ from `numpy.random.randn()` and `diffusers.utils.randn_tensor`. So, it's expected that image generated by Python and C++ versions provide different images, because latent images are initialize differently. Users can implement their own random generator derived from `ov::genai::Generator` and pass it to `Text2ImagePipeline::generate` method. diff --git a/samples/cpp/stable_diffusion/512x512.bmp b/samples/cpp/text2image/512x512.bmp similarity index 100% rename from samples/cpp/stable_diffusion/512x512.bmp rename to samples/cpp/text2image/512x512.bmp diff --git a/samples/cpp/stable_diffusion/CMakeLists.txt b/samples/cpp/text2image/CMakeLists.txt similarity index 56% rename from samples/cpp/stable_diffusion/CMakeLists.txt rename to samples/cpp/text2image/CMakeLists.txt index a7a6f067b3..ca0f832f6d 100644 --- a/samples/cpp/stable_diffusion/CMakeLists.txt +++ b/samples/cpp/text2image/CMakeLists.txt @@ -8,7 +8,7 @@ find_package(OpenVINOGenAI REQUIRED NO_CMAKE_FIND_ROOT_PATH ) -# create executable +# create main sample executable add_executable(stable_diffusion ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp @@ -26,3 +26,22 @@ install(TARGETS stable_diffusion RUNTIME DESTINATION samples_bin/ COMPONENT samples_bin EXCLUDE_FROM_ALL) + +# create LoRA sample executable + +add_executable(lora_stable_diffusion + ${CMAKE_CURRENT_SOURCE_DIR}/lora.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/imwrite.cpp) + +target_include_directories(lora_stable_diffusion PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(lora_stable_diffusion PRIVATE openvino::genai) + +set_target_properties(lora_stable_diffusion PROPERTIES + COMPILE_PDB_NAME lora_stable_diffusion + # Ensure out of box LC_RPATH on macOS with SIP + INSTALL_RPATH_USE_LINK_PATH ON) + +install(TARGETS lora_stable_diffusion + RUNTIME DESTINATION samples_bin/ + COMPONENT samples_bin + EXCLUDE_FROM_ALL) diff --git a/samples/cpp/text2image/README.md b/samples/cpp/text2image/README.md new file mode 100644 index 0000000000..e1401e8795 --- /dev/null +++ b/samples/cpp/text2image/README.md @@ -0,0 +1,76 @@ +# Text to Image C++ Generation Pipeline + +Examples in this folder showcase inference of text to image models like Stable Diffusion 1.5, 2.1, LCM. The application doesn't have many configuration options to encourage the reader to explore and modify the source code. For example, change the device for inference to GPU. The sample features `ov::genai::Text2ImagePipeline` and uses a text prompt as input source. + +There are two sample files: + - [`main.cpp`](./main.cpp) demonstrates basic usage of the text to image pipeline + - [`lora.cpp`](./lora.cpp) shows how to apply LoRA adapters to the pipeline + +Users can change the sample code and play with the following generation parameters: + +- Change width or height of generated image +- Generate multiple images per prompt +- Adjust a number of inference steps +- Play with [guidance scale](https://huggingface.co/spaces/stabilityai/stable-diffusion/discussions/9) (read [more details](https://arxiv.org/abs/2207.12598)) +- (SD 1.x, 2.x only) Add negative prompt when guidance scale > 1 +- Apply multiple different LoRA adapters and mix them with different blending coefficients + +## Download and convert the models and tokenizers + +The `--upgrade-strategy eager` option is needed to ensure `optimum-intel` is upgraded to the latest version. + +It's not required to install [../../requirements.txt](../../requirements.txt) for deployment if the model has already been exported. + +```sh +pip install --upgrade-strategy eager -r ../../requirements.txt +optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --task stable-diffusion --weight-format fp16 dreamlike_anime_1_0_ov/FP16 +``` + +## Run + +`stable_diffusion ./dreamlike_anime_1_0_ov/FP16 'cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting'` + +### Examples + +Prompt: `cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting` + + ![](./512x512.bmp) + +## Supported models + +Models can be downloaded from [HiggingFace](https://huggingface.co/models). This sample can run the following list of models, but not limitied to: + +- [botp/stable-diffusion-v1-5](https://huggingface.co/botp/stable-diffusion-v1-5) +- [stabilityai/stable-diffusion-2](https://huggingface.co/stabilityai/stable-diffusion-2) +- [stabilityai/stable-diffusion-2-1](https://huggingface.co/stabilityai/stable-diffusion-2-1) +- [dreamlike-art/dreamlike-anime-1.0](https://huggingface.co/dreamlike-art/dreamlike-anime-1.0) +- [SimianLuo/LCM_Dreamshaper_v7](https://huggingface.co/SimianLuo/LCM_Dreamshaper_v7) + +## Run with optional LoRA adapters + +LoRA adapters can be connected to the pipeline and modify generated images to have certain style, details or quality. Adapters are supported in Safetensors format and can be downloaded from public sources like [Civitai](https://civitai.com) or [HuggingFace](https://huggingface.co/models) or trained by the user. Adapters compatible with a base model should be used only. A weighted blend of multiple adapters can be applied by specifying multple adapter files with corresponding alpha parameters in command line. Check `lora.cpp` source code to learn how to enable adapters and specify them in each `generate` call. + +Here is an example how to run the sample with a single adapter. First download adapter file from https://civitai.com/models/67927/soulcard page manually and save it as `soulcard.safetensors`. Or download it from command line: + +`wget -O soulcard.safetensors https://civitai.com/api/download/models/72591` + +Then run `lora_stable_diffusion` executable: + +`./lora_stable_diffusion dreamlike_anime_1_0_ov/FP16 'curly-haired unicorn in the forest, anime, line' soulcard.safetensors 0.7` + +The sample generates two images with and without adapters applied using the same prompt: + - `lora.bmp` with adapters applied + - `baseline.bmp` without adapters applied + +Check the difference: + +With adapter | Without adapter +:---:|:---: +![](./lora.bmp) | ![](./baseline.bmp) + + +## Note + +- Image generated with HuggingFace / Optimum Intel is not the same generated by this C++ sample: + +C++ random generation with MT19937 results differ from `numpy.random.randn()` and `diffusers.utils.randn_tensor`. So, it's expected that image generated by Python and C++ versions provide different images, because latent images are initialize differently. Users can implement their own random generator derived from `ov::genai::Generator` and pass it to `Text2ImagePipeline::generate` method. diff --git a/samples/cpp/text2image/baseline.bmp b/samples/cpp/text2image/baseline.bmp new file mode 100644 index 0000000000000000000000000000000000000000..aa9a51ccf61fb03aa2092829a33202f1e739fe4f GIT binary patch literal 1376310 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 z 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

G4_9S-bGSQ7qLmwI zOJcLHuOSNkua>H)9#tBbJ8S_o!SIA51U5|yLfXpYXej~q0R)8lFJ?f&9YIJB=p{wU zR6`UDH*;+n3oU6IZSUfkteNJp?xM(n>ZpM#|Jn>@RZ2p4RcL)SB)}dS5ndUQ9?7BZ zNg%!&Q~-n#gyMgGdVWb(0JsaBqW+(JKR*3- zbn@-!^y|?HE&^x--;b~wI6wSyaroiv+y42Nrx$M?9&gU?msE5+bE3?={k2@3XfBSb zcK@HKxA3Yv&6-C4hHLLkPv4p8?ig|0-QC?G!5snw4FnJF?(XjH?sho1yOUs%ThF1t z@Ai7;w+;u=Im7Bzdq1^nS7{2rGZZ8*bUD>E__Vc!^$mH|v^eF|n5E?Dc*NOdRCTRg zKZmF06g4%qjtmSfOiZoK%x=xi?aa^YOpk3&46F{dFLqW=RAh7{1{b^7hN&uBa`Gs= zWE6PKD!?Kr{ECC?2@50H2xFnApNNI7_z^P=s4 znDC;G5Wq*VV1U&#Jqdp&3G$C0F=Gdr?g`uLr);kuv%LJ1_2plz&p8wX?1J14JuPLd z)YvqH`1PdJ9Nx*As!15D$l7QMnaD}lsG5a1@*69$s0;Gxh-iX1tWGiwbrd#J3a?AI zN&JK$;Fl7toNB_HXpIzMpvs2u7hY8{F4#UGGFwi7PhEmpju#%GyxLM?M#@M8gRqke zLuYltXYw5X6=!;>%BSRMl-OI9Gtt0fru;~Pg-uUZ(b?#&f&hX5;05{@7sFF-rsr79 z=VpG!MgJ6q3|YV=@DW3nSD1{TME>i=BVzuEa2$pg*l`1g2485(?b*ogTERef*Vfwf zuiNS!D(=4`PVbTSD`*MFNL3bXr2T@Wk)c zFa=15GzfD6kUwyT!wQ&FO^$10fk$(ZPiN&9aQ^-EWDw9^;oDIG@DCk?3aBfcI-E4! z|E0eka-fvCq15@|6qrBE4h9dl1obxt_0|RV*9CM`x>se}6(l&8Cd2&4COgU|Bis^K zfRqr^#2`>WApe2?qy$8HqXc073-TWlP+S4D$SuH0)!#|o-$@m+fAs%e)=&W{_}ZGJ zeZi)NU0FiK-b@?NzZ%!j1QryNt(Zxx^%2EKFo4y*8f+VwoB!`L|k#>s{3kU{G zgk{7SBn4lJ^3qEQ;0gfzhaw1~P#l0ih#*`FUP7`rY{p1Sc=yQh z&g{iu+3axYU{k^DfKO%C$C4E9#(d~PKQ&;jBhwWxY72r|%2NhfQ+ivHdfI{;%Ol(2 zBUhEs)0jHYj+D3TiT=#d?wslVu*OQK!~~D{)PkCx^_8=;Eo4|;9nV}Hj$iHco@{m; zZnYh5wC=CNcB*A>r4hCxyYtnXQ{`)Obz2ivtD_am6ZNaDm1CiixjMG4Li+k9;XXmt zS+Q-!aUG?F!|k10lUZ%GrLB$o=f^*Pq3M61cW!|5gzfoGV|+;G|2NxDkpCXlfgnFQ zH2vrG{oPlh0>!}y_y*ul1_3uH1VkEoiG%6D_1)#yJ4ir}Pj8M6zV2^a?k`;)Qm*zU zF1Lp-mOGDE`cDU%7lT8y)l6+g^z>vb&BRUL^J;5yK?0<%#-gAkprb3SWgw`g#V8`f zucYJP6;W8(K03X$xqWhcifaW{4^VDy&oA#z&u>pp?v4-dj&^Pj)^2wfuQ#TzmWNMf zI(FI$CsMwYTNr%e^+ zz_9Xv=>GcWtHj`y)BE4?f~mVX~} zljYz4;@ZOU8Yz&^I0y^$UwXRV@e3s6|0~>;AZ;Sm5W1k(Pf-P6vJESn-Cs8il-t zHot@(!4Cx1@sM|7wu>cS$UaH`Pa@zU3c`XgF$I!DG%)a=wgoIN$*3a7uBieGP);2U z?0>tfO>ovS4LAduhn6GTS;Y5zLQmQ8FQXU<6lArofKH z>GnmbxCmezY+DSjAkz*uK{eUFJv9M6bx4HtfU2;m*r&Z5-D5~!ebi`s9KfG4l)pZo zIME$9+LcKe&0U&InCOWd>5LxjM0QL-Uwue_L(C|mN$T8TI$fCXp*YbF7W7$>H2e=E z{eM!BX);tm0nq;&MicTMBVe6y51lX%-Ea@hU{{Smm_K|VCBV;7GYC^)^#68>{tl|a zAGKnA6oXx$UGeKK`B;}~Q5J7qnPgv?8a~uGczfEov&L&`@_%sg@qF|$%&HU!$)tA= z<@JfPEo+M#p)~HFH6EO_9(}D@zw)W*Qg-o^wsnyEU@wemyS5sSHYR=8$Ofk;h7mB6 zoEW6tI1u^ZF7O(FFABn+^#34yUeN*{Ng=>@@g?wIT7UuKPbE=SWpVWXy!!Hj@0B#X zt^6udBf5$azvxm7@lSMcTY*Druz94H3G#V;9NzhTFb;4w3;Jjl=wgA%Z?LNgl>byaJNnV@}(&+qN60dvoxl+GO?$jXu7{{eX3-xA1uZVaZAu&Lh-;~dYOIcHsVf@o zEuR{}fBAKj<0bw54f9hq(_=-0y>V4Fe#zO&3`)f^mn{5aIJzB2cU98=ntK6I^U!N}Dn6BCwDWp!6ua4I(b(c?uhh-_gvo`c} zb4`nGSQ)CG>n|JbY^Dy>P4sRb?*9Po^Yib{pYZx%cL>c-D+d64+BM(-`DxAnLv^^n z#r`kZ1;dj-Jy`)G^IviWAQI4qrMmd-clPuHi8SBH*P`;V8p zjux8^s7(hmRofF~Tayi29c9!00ZD2WHp(_uBF2Vtc2=UsaD+3KwXl*mu@qL*<&ajf z_!v-L-?6Z~gK5Io+wWf?K*C={8$e%NT%R3X9q(Npte@{KpKs5du8*IrkDja!9544A zQ9BNndQRt>cL$0n*>5$Dtq<<^&EQWJQqz{O)I2E%_ILrGpENj3v9P9rIC zM-5Z~sR_M@hKdh7|64Im((^<1FU`v=!^0{kz$Pnzl(DxG*rsQrm*wTwk;Gpi zVxqvLA@o>+>6J34n5|0QR8w+qnN7SOx3Mgp9G9}UMO0f6{7C;J$ngJizIZ0e_Jp4q z{QqBoeJ%!E0bcMh({VFBg9`+HZ_IC?^TDqUc5uLafd4x(v$IsRJo%-g!X_^c&d(q6Vy!bG zZ8O8o6N8cThZO)!SfKwQ`u|8TF#jk4X#NTQV+#!ZKaKoX3v@&kQ1-P~^~VaBt=bnC z&1g@xC=Wq*GnpWJv+Ss{GfMnIk3(aQb$Lo)cSZ5?biwSHWn|><65{_=(Nqad)y%Bn z@=tmBF_gzIK|8f9pno!IlA1-`Dp=glpV~By$`G@~E|{gFlY@Z1E~mB{ueLIqk~E8= z1gnx1vz#~%I)6Yt#=d}k!uG@ML4u5c-%9dhF8~L;(8FB-vQI_@VQwuMc2x;BRS8iN zeJCYnr)e7RgZNt4(uBa~9Jtm8G-P`gCO9LXG1k{8(8V~=#XQ*ED#XJo*wZx78O^_G zxVw3zC-{HM7$3W|V8?=JC_h7+i(0p4yARg-&NrL3W&>(-qr0H|pRQb+=-OX}BRA#x ztZ1yOXM1Vy*N>r-t+>uQ&$0}sq7?J=7@yjru;!}l@vh{a=JL6*2FhgT+{_x52fuzj zy!}SJbZ&3YZ*D-999>;)9Uo6GuU5DA#3mQ#<~4LQqKz2o$Q_-mTUu(_IUc$^9=zP| zKi};;+w3^n>N;6zKA==?E!1vPDz_wN_U!5JUO^L*}gbhzc^gHIG|i^PoAy!AFuTtt#%zR zw;j&Z?o3s0%wSKWVQ0F2yDfJ#)H79BQ0>p>%#RtFU$Cu*p0LR$+LIJ^euPg`^%CeQdT z@*ipYTx381^9KMv8U7Mq2vQLq_My=EMvnkqIPU!*s1fI z$sr@2+en5-Uy9cdggF-n_P-QqnJ>V6TKE^eI0wW(Fok21;z0?35$IbfZXpAC-A|T= zepd8q{I8Yy1TB^HLmlMY-m@7<@xXL2<&&V9qJMQ-;asm>tRJ(M1Qx*_2{8VL^9_RF zA8{gW^UZS*L0n8ofq|Ky{l&T))EnsKNZ>rDxUK4A-TzaZ(S_%wU`c@#eZ)n{~bO;Rpq2wnak4XC! zhVt_%5~H99k`R6-B0wjCR1x@z!BU3S{EG=c7e^uh_2bbrm2b&0PyF-PKwogDF+J~CtF2N2U#x%uadO!qy53%^#w!dO@GXiw5;cgMwE%f(*W^kCdbN9Mw4_RLWC>2}NRT10oPZEl=>ZXCeh zDm}sm`p=Y5v&1jvNg>AZWCg%5+Q%ry7x=Fa{ZE*O9>o7p{scN}5c21PdXO{1K7jvt zp&sNU=Vc?~YoiqUQ8n6AC)UTYIx}Ff#-cn$CdSLYDkFBh%^@evvpm->C0^Lt>~~qI zSMMxzvn!>OE17(gSiR!~L((Q@Bgc>2D{ZNF!A>59v3|8#KJ{6lJ*6HMsXjGnK9#9%xltC;UdCTs%z|Bk z|7Jn1H2&YwG=zwMkP+{g9Aq2sZ;|My8|C(?I<0+oVgBpk?9K7`?Lq!*Z}M<+(m*3j zK`U3syHD5J_m(mTThhAgh7ULAZchrQ2LtL00-K6M+p0q9D+6lELMn^HYKp3-MiwrP zj&8qQfkFr0{`2SEub;O+f81fm7Q&nR`)f4bKYpO6J=i;4Uf7(STpQ`0ugUHxi)knf zudj$~t&Q&Lh#R6*t}Hd~Y_uM%w;jTeda+?^xnXCaYLim6Ia{_dSFt`@zCKa7G+MYg zR!p6&TWl>FGP87d4~gnuo*Uj=N@*x>o9z4c3xD~KyIZ(A+@te{p7WOAKQN!rK45rI z0#F(5f6&k#2u~;=@|u7@`SKP|R0;ePrp4bb@6L9<9j#pM&!2CPpRDyCt#lnMw(Ku9 z?k(2uE!OTY*6mYk_bI^qs@<8A?YWYj*`h6SO14I_R|oT!2g(+UGh6N5{AG>ImCP(v ztn8F6t@)HSW#5~n7FW)%Z(d;0?C$;>E*&)92^$B8XO}1ES7*nUr-xT3TUQ5*=i6h) z8v_UHeMf6uN2~1zD{Y5MEr)Y8d*j9HBM28SS{=$?oUGdDEt<)SDA!am`{NnoqnFH# z{JhWDSf8>nk=Pd)!O_f|0aL`%4NL`|2zCTlLz`p%g>Xa62$)_yho>k#NpJb*lRv;? zBimr)v}AWfkd;>j1BgB(I)0r=~EYDz~(qx|FTD ztc`}0wVI0iI|XNbNgE9w;?=B1uguS+EXa+qFP37Ii3Jdck`RgglHfw}Bak1V05}Yi zT&xO$tcnm(2)tF|9nj9$=OQQqB`vurLdL!2jQHZ^AtYo_H^x zmi6}cP!|@yp3ncfuG^*>#Q8J5(_}Ny0Qb(Nr^c;=d=_PPZ6$1Yp~HvUKd5`6`B9X7 zAt{8J?=uNOi~ycO_6a8_bpDX~z$aFOfIkMobfVY=0P-V3Na&>mddcu|{0hS_mMw%g?N*9JkPWFnX1{1p* z;rX96(pf$+uy}cL`s@1<><+HaIyM(d=SN!)mI|f^ zt{U&g;;_C(#0nQKPBtEH+ZBX0yx0?6YE4G)4mZoy&hQR^%pYM%c9+k{Z_|zAG z|ADo;eNK#ZdW02O{tc$hf1&>m#QfJF@-xBzNH5$1p#Rqman}lR)eLl24{%iTL-TKs z7bpbEe)e+S*0NsKDqo!6B?kxgRV2)GLa=08k|^izq8jljdtn5^-I3$n(wT9K_z0~K zUp8Zde?z3_=C51aCK6XF6j>}0Q_3HZ&gGRL5uB1p8a zgofWZ@S{oKN8_C#0SY;XE-Yx(>TZ1XGTM^Xmc9t2=1LmdfS&57;xu{Gtz-R+wf zr(b{G6SRLoQ6MUy78nc3JvrYAt^!T*;s@baZf@?sUEJJW-QApjzdgP`rk;=1%r+!- zmxner#B{GTZESTMYz>@JnzrWa*Jmr&C^ef46`LpovlZ(TMN1RK3!?>;>B^Py8fsQj zrDt$dLvLT}^hi!y{r=_A_n&}w*te070KpGnAL35}_M z;>_f4&g5-O<*ZNTZcOB?PUfzTWG@fqE_Rj7rl(YCm^sNCS&C@ub1JGz>b}dauH8I4 zg4Y~8DDY9qCfeQYDFj7duZhdhx7*XBZ@b`pCeiTkuXXONwC*i6?NV!Z=5ZA&!>?j% zwt8o>Y;&x5ZK7mjFq_(+y)ay~G+Ie5OKmaGwf~cj<+rEL-|%s^)Eb9^42;4uiE(>8*^{6NW%S^!8#^N&jb^zE1e;K%TSB)kLm z2{lAqfXGAuJwIjvw7D>0guwX_r4UL33?&|c9(ls_ip-Z8VMh1z_t%eK3b7^Bq&{4tMI*(;L;OiP~#Ocm6vnW;(I48Y@(p_L08;VNzzhH z)=@{(&qB~t5qJ()H#S6i$?~$u@NpshOG$_g`hOW-dT~w^0!Arb7BE7x{5+ZxPehm> zi!w543cgg}z=gT zn^!5ZosDWC9*nxGye6=&(&9lRkhTgNyn<0~41mw-9!hDZ~$P;$~_5+BrmxeZ*+o#_A4TprWckTB3vMHyeZKHt9k zy8GjX^7Xi5W1)F-Y2@xGW3=11t{{H6HEN(fw7(W^U>_?paRmVWL+p(~0F?ib10fXP z1BnBG7AW1JEDbMkH2^yVIjCD*J|X~M1Q9ma;@e*3-BK3PUmrcx8av!lvO1HuFjlrS zQ@gq_aBS3xh@@ci z#4i@fA*S(PjAH%YNBO>w{H!10WeEO1)Lk#c9nJ$fUtD#d0s{W~I;i=7Q1P{sgYdx9 zOwP+%#>eVINpjBeaO1a)@Zr|rp?b_Rlmea8r;sFaNxi+H-hOjPO5%n8fV(rDy6W$W zYO>Lps<{pPVR>RPrDD+qOzz<N4Y~E}~^gwk`XR&{K{>Snp|AyS?&WbOMIaYB#MqkLZ*YNWPvo9`2 z0hs@~S%i7m#Q1(l477~-Y?~ZpnH*@79-Q1?-v^d`Wiof76O*0rj`EQ9;>3}roSBZ0 zroyO>ijw8Amcyma)3v(I+35D_pr+EaiSE>q&e)EI)V9XjsnMR9siSY$tNr=?=T8E& zgjb;fxer{S`_|(C~Qw*Y`X4ZNhaEMFF({lACXUzwciUZZ=1EdWwfL z11qZ|n-^QwHhKb{Qc%M(;ge2!ZjtQ(M7GuF*; z`?v@AAMAbGS~y)9IauvISZ>F4V|M|pYvtB_+2&mF7HZ9O;rdkZ`b6>Cc+tjK!P-d9 z>R{F)sz6W1On>oAT}GF!i3i)P(Z^!v3+3SV7mxn&^bfKWM%K6h^&|oe|0=LOC;@8(EpOB4nl#0a24bcPe1_6$?uN4VT5|T?0Qryb|G{3lk{kBxve64w5{@Bxq5f8WMw*SytnmmYvAg*_k6#8cO`3jsE{%_ zd4JKqzm_vISWKPjI^8K-ne}hM+%v%$L+6}0+sr6j0nq$g;0gf!e_X&j5a7sQg5fsi zzaW3YX!!rdP4|ndZm^4HAjF^c8o+-aJ7sShWnUX%Cqpq;BUsjC%=h{=m*(%x=Iu_w zTu3R{C8WK&VsXm9rpPKYT+H2u!%|*%5F=Aq}|CGyUIQC^BuO&$~wucjiaf;h9h7_c2s z4|yk`9%>(=_Ll+v3t%;qvrY!%~!nlFz$o5kI%5>YLK+`Y}lP|8u0WKE7ZkC}QR-qoie}@Er=cFL(I6wTr zhxAa#+{m!zqO{@W$o5JYCiqlk!S*Mvv!;4^EM=%6pe8%GsW6<(K0vn&r;N47^)&@G zlt;GJCHJ>Q*H#vGcFgYXd`0W}6O-2OKM2O+AJTgho(2EVz5>!dblL=sX-il@I1t^J zpu6t~IdgUW4YJH@5H>`q`Q!fl`{K}AVQh8cr<|U`!PVZ~wXQu%^X7ELGNopVQniku zz--CdeDT^;!QxQf{8-asMQL+RQQ0gNdw6%>0jLkR4}1W8B7ix;e1h#X+Mm!qWFG*Z z7RV1`3XBl`FW_${1p%M+2j&(h>sLEt$Ln2ttBt$MHM@)DJBy`z3x&J$`P;KO*oWVk z$=)OfFETe~veu_E)}}Jo@SMiUT$|2Xo6269%vu>sU!KTX8P8biPoC?`ooy=}{SuI< zYGPH^*>ZSyc|!;)d@}U?STw+38SOv$U18l|fBR~A@|fDaGvB;Lso$Eb+MFrfm?>GG zD%_YZSVLKv$c8P;%0%Akc){9u{`z?C+HltLU^;aqducFh9^`Cq{$y=Nx3Qtqe_t~H z^BLU>4pv4%p2r9X2HS(qoar@bR%zZoSPjEO;Gd)rJf@WZ;%W2X_6d;x^EDaWf(0V$ zU@(Py0q{pZ{~SS(v?@S{wJ-Gl=<}iTN9PZm#})t)zz|}D+#~QUgaW__nhb@>A^@2J zV+!z`lkuN#9?|hIy#Hk5p6IXc^8S?^54)xqqXM_Mv10CMvulixh^Y#zx&V_3Kf4|x z+QqOSEM}slVyh#pFC%1(x*#K9qNwWjUdTkAOSTI{e=Y(F9+Bj=>NqzS*7{j zim^Z30$z);Bh||)+QTP5QqV$)Sxb~vU+k447rmw+>w76i9T9#r6;^#2)^{?puIAi^ z3a{k&p}2kpDoIA*g#at?{|!Hqmofik0r-Ogf}Zvn0@qlet;ISUob;Zc{|70Au{f;r z;Fttnbm{JL@#j_l*^X0oGN0``PBU$;_gcJ0T2SDC{2^hWSP_+%1l3P7c_TZ#!2bth zAG|}f{W4_#_hAZvTL3Wv5)*_MD8L{2U$jMlhvi=k3q+nH2p;@D{C^Z=n3Ul{hP7f9 zb{#c#9iso|(%0Za8nuam5MqgJOhl}Wglr6fpTk$jeJ6V{@Zsrz$iF*#x<75OEux_; zf26l{os!_O^!%y4sXPnB<5scRjG{j`r&SBzg=PS z1OJcJU|a`a)a+V~lZz67TYzg_o_A}7XLFfnYq?uPzGq``@^oL`%4F&KT*=Z@`e;w% z&T1#fsKqJ7(C5yNwSWn@Ix3=0CJl9FP7hVD&*jgJed(+O{=1i_+vP;tXUABlg`xAe zN(sRT08?O-#2_;S!65uA%+nwo$&c>n{Ivr=>IAvqXh8Xi$uG!%KL<5mYysP<1~}+N zf6|Nn{66K2cAT#T^pKrpZZ)}9xv`#=*-?Gfnh~BN9%jOBX2Qe0q`k>(|kbpNDtfcdu?XuYa^scTB@m6dgVFJ-yXFIPz$! zBLs>=O^!oNmJR(sjtZoqqNoB)a#-sI;0r}XT^T!(K>mOBRG@&4xFpWb8U`^C*7)E%;a zt8h=Ns83k_a!B-t&f!CPuzP-tS5d;}iWJY1WVga3PwYPQ)^+c$Y}|jFJv~HtZqv$C zLVI;=Pfa@V#g<2bJz3KOku7ymjdd9vZ3W$(y;C!o?f(4r6F^I#mDcK$1zI%TfL`1M zev;Pu?}H6od`Wu;J`8Z$zxj1{^OKx!cehu!#AX?0JH&PQ=Jp4;mxHhKeblUwvaH|= zO4G_(=RT!zeX3%4wsLj8a&4hvW4dret;}o=_Dxt?U%&Z*{o=2n`me9AFTSD%5*`R2@$2R7?#lUc|Ncz# z2G$>d{1|)y`KOE4XvmMU0w4C(@ywNpj1^E!6FDnmC^5OKqqu0KQhO3-`(T@%M{P+O zY0VfeNoms3HvjF>^S@rb#enh=BlIftAn?)K|A$1qz^M{k5agg_1(>EG}rLvy)AOOGl*1phRI2lxZ$LHIvHQY49nClXN7{L`eNSOf#} z5A*+LtZ$I~@)Qv&tV9Cz7sqQ(1wj=%eN21V)C719q|o7WsR@Y~%2p*5JoaI_WCA8mf30!LA3?5WPGfpOzGCf7s=PvHT0!51T9> zgBT|c`hNt$zY>M57W-RCPQ>BKJL+)h%WxP-vg?SykmcZfFC}2D%B(LgVxu8ssl{im z&TJt4T1DWc0xz?g7@L|TgA_j<9}AlQXB>>+`H}wuxfD5UFxi8*((6AMo)adG=_MxV z4>o#mfrHg*%wT(BS5yD>Vd?UeSxTgcn+2Ph7R3L2Cb}?TVAE7$gyBCN{$*eh4Bt-V zw!^~*n2(Vz_yZG5O`tRpU0$1pf2B*Txip*H~N3+E~QKNW|vdr_$8I$-(%}M&H`PjLDw7 z*}<%d-bl#u%d)DeW5ehB_-^KCR{>=#mpU9f+!{X6;14H zug!HRNpmjCfFj5lnx8Vl2%$ir^M@S}zUy9}@6mv0c;W*0sioArwJfl!CVHp^GvAuM zV6+oKHJHA zS}Ay2%6nTICHuRSB~mxFL7o)H>O}hpelX*= zFl5$J`%O~(zd8mAaalY8$!wpZ#iO$$$CfvM|KES?;r{;ZX6Nc=1Bo1F4=lU$?f>`^^aO(uW_g`Gz1v+B| z%rg8Fl%E!1o>2Z<$9{H9{$igL;G7lysVF|MDkG>m6Xuz2g>fHqV~WSR_kP`9{`$3X zjA`dFGEH*F+Ee@M(?;70sKc2veKGwlac#|Ub@i$BHH~8|X;?cmFa)Rpm+mC4kViL~YMv?a9t0RNFx>R9UH zM8@J!()36coO8!hLUV@t#=ighMN$SJD#b4Zoj;5zZtq|vx3h4Dwto(J1{G^FrK?i~ zt5f-Su1(|t?N`P#m&b6@akE$&!(Wk(Jf!8(wB_OSrIGZd;k3oR#CcKz(q|Cl(;PR@ zTQHuRP$ea=^{=N;;4nOAV}gMXU>pu_=)y&%YqrVIlNHWSJvzzC&2;BC#N%$`-j5XdO{}-)E z3C|-YNVd9Yd%o!W@y-*_{-_0_1pFcXe1gnS3E{W!43v|3B?Q!F|2R4Lo0sn0Z6M^{{{^B+4 zARe{=>`PMc4yYj<=c-JXx@@>D^X}&99iruGsO;$iZfWd}S?;C60B) z478?C4aARhWzG(ltb^~QWK8sBP7O96u6LjB*KIE)kN0_17dREAx>aOi{tNMsMbZ}w z!v6=E!v7im|49Cd^v0n{Kt1(w1qgQ63wF~Da@F#4((rdw@v&F+v7_O?rL?<=vX3pi zG{d{gqIxQ8H>SIGSG&)*8&20;Yw}d0y+4#BX-9bJ#Cqu^`KW|@2s@atzJpJ=##4Ej z{}GqsarP4QPh@rp=KdVzTH8B)^?mc^X6x(K?)CNF#n(O9L|^^PXdBh`4$*M^^xn@` z%F2XOQ=VN_id|ENLrsQ5l@tPYWeFxZQCPh(D~QoZA#r9!FFJTT<34U#P zUQHS3e>k;dgv`{u%aXHZ+rzpm{921b`l=jD61?g&lE<4vTMFRq@a~I?F-`Mtj-9V? zPt#CW(@=MZqyXD^U&pjBZuwDg(+#W7i)}3psLBkiPR|^yU%ou}_UjkK=MZh~-QToO z#xr`FV31xk)ek*bLR({AUr*iGczJhkd3(#^4w&|zKjEeM!1Vz5Nhu)z5EkWs6YPX$ zAz(}R7IG^Ba5Q@z>ph^ZkSK^V4r%Pw%g{ zZrk#D5x(1%Iy_lInW-G#;tYQ@Gv;RYoKXLCMtV-~QV zzCMFKKV@}_K>f;O%JM|Y@_5qncru<#6N%&nc_(FQEQxkf7ROSkqiHw`BdH6+NtDr4 z%2?{$aLVjR?o4Y&Ph3FC`7xYCznz?4kjw$v2;lVidVThg+P*zgjd9o7Owsyu-s%io zadRK$2rCoWKz`gQmT|^Xm&Wkdr7n-BuHZSE`hfq`{^W(;#M$n|>Atj?zO?DCw6X4j z@q{lqynGVBKY99!mE|=egAvgMt_A{r#@Aqe{^#kRm;%7K@}YNqU@%Y%{`vf`f4_N3 z!+EGcu?z4FHwbV$*a)DVzrg1cwg=vEFNw$p^v-`k6Vc3n$iNrtz>xZoNinikY84KUSExti!qOun68^y^+ZQEb+oX(tYN&@%+CR1 ztj6_;p3NzZPnH743czYfM=c>MMNL0Tiv+K#l_9tEU@V0(De*rSVIfvO(tJ#koE$O& z%o1D-BJALQFcg5xG$cTbIC9*q$^uMEymaEsY+52h=E!2^VUXwH(h=u2l;JZ`^2m>o zu+d`EmV6=2K_|ifQk;uLNti`R^o=+-odDbK49{Nh!eNOC!{0yP|HDl7=FtCx>B7!0 zxh~PX;2{1d`u|sS1!qf9Q=RGw0lEo6dWk_oZsr`8y8KoK%-Twfi27BKq{rs3iY$q4 zAxU0X_!W38!iOR66EQOIC4x`l`~cfGfyY9;kA-<33-CS@;Ro_RCHy}T|G$*@I|cHE z1j&Mg1vHeOFn_@07x)irK{kkgPy)1|q{Z^DE}IU#mGng{-wBu+NIFx%>HOY#?nD>i4d7e~CCOQ7oUYA*RyUx-P8 zcTE9SfPI=vTyPht$gqbC5O%(hkzJeucW5FCEltDK0OwSJOzW{%KXH9=+ z%zxEJ9st4Z-_$_N-Ja_Pzmn5#MG#1v3_Bl@ZwN|Wr%5}Yei!uzU{ zCt9)3<&Yj`5%(EE02l$7g}6fbX&&Kj8SP~g?_-Gjl zSKAv`+nbj=TNiuV=O>5XuFmdm_I|cy^#q$H)I_umWKE0}&rg;w4&~1dmCep|tWR{z zdfEj~_0C=HT_3HTAFZ69>|9+QVP%UL_>&DTLaY!PiYDqIJwGY}W)NfmjcWm_!`+X| zgX`6yo%yFvI3g9Vjp~|NxEo`bJ?`mY=;~;5)WEQ~}vh1vCB7BBeF2h(s7%A{C z_}E_ZvC?s&^M{T0YqA2s_Li*95$1JgvW ztn@fcwOI|-SagxbrTkh^>b1P&3t3SF{(|a%*z+ZR4pL<1i$yTf@I&x}v9G8AXdhe$ za7O?&1n_?%#D^&`2!G%|LV-~W@Wfsit`abR0RDsj#}pXg&#s9?S``iqe-T1ttOw^$ zK{EqUDn9i!A`O(tl zaag@2BYUyC&ab@^>AfyxnI2WS{`I9H9W`Nn4epiMnEAR^X4w}c+ZCqR7QhQ42}W=j z0Ra4I(jejm1mwrl5f_A-EYGH*Pt7IXEv13owGptD8*Yn-wq$-NcC<4T8l=hY*pc?& zp1SDa_N@8Q!lmiL<;lc}zAq#=xWc(K-L@d!HaFfeFAl?B@c+>NTVnq=o|FI}|GP+- ze|m%e*9&{#|J{K6nto2|z8}|`hbf;dhn5_t zCZ_*VY$}qhs;~hRWsny|Az+jfWl|Kw)qqt|9N>@da;iyV`4>+<9eEx-1yM_#_Yq#c z)!Ct46)rUy-p%=bZN*Myi5`_{Uz!X2t1}!kLQKM3jesW8A7$4Ip51T|^ z*W7T|f*7B&RCNAdYO_P@vf~;Hnx}^@$c`))X73MAPljh^#+T=*hufQHCrCp7_Uk*6 zaPNNof|PT9X?2#e073=$54IopN(g_n{0|yS5Gkk%gkT}EPts$Plr1uf1^(av{DH8= z^GhfjZ;rOV?XO(zV5e#JVuy0IGk>)`ceOEdu{nRWK6kM}xm;a1U0*oc+ki*J^(Ez| zIjYr7-p@tOuQ;fBAZN5EXS}~;a-?Q9C$Ts=EN^XWb7%T!ePnNc{P=Y7>U`z;YUc(Q zn#Ym{ikB#btCZZ;`K*=M^yS&K<(bsw z>D1+kWS~8DJaJ(xkxEVio(p)6BrJ}^FW`(O;7c0#$5TfB*BMTr3?at?;E(^NlV=7J zrUsKIhtsCUa^`Ra2z8A;-hqw8J)$MgPH#3APsiKV`->=J`P9k6rPjMC{dsOqKLL+t90W{af%gi>km&VHQ?d zJ{}bj#7eSB!v$1`O4W&#&Jjw@~V{4PtT=ZBp1X;Dj9`iFl7h-!O%0(~2{aTRY3Fn)~NP*#C zfD6P^vIR^`P2mMWz#pP1;(!4OD3JqU%9(#g4H>Fc4f(_j!v`x}PzS7fs+&R*ALu{%Ap3u>iz8@eC}w3WVQ(hoXeDCv-XOv^ zqO(4#rzv)zF=M2?W_hx0V?MRJF`}t7w7w*zud!}pu54*MqN6sdzcH-4*1x?H2>hkJ zGQ6`kxVgf+rqHu8*R3K4SupSf_=x1M;$)aVp#LYGKSV(#L=FUY2*Y1Eg3@vUa+7^L)f$rLbaiqYHr_YWQEKP-UHAD=6 zDe4XEr~v1r(M{9Z50-7YWUQ%!nQUuDtqSjEbOT~4fVT1fWdaP#ph zqOYVrJMh{Y3OX8zI2rR;XfbFjywz5Ct|0M$@o@Y@Qc}pvkKNt-m6ao#o%{Rbg5;68 zj-#vbtJ|5Y+li~2(QntC7k4?74dcW#S$7Xvrw`!Y;QPU*CCjCQZFg+DC~#@Xb83JQ zl4VoDju=*brCC)ZF&)4afCFTasw9_&G>4irkG34Qo+68`jBb!~U}FLB->xX`Q%i36 zXhT3-VPG>h0!saBGMuwQ%_2Oo1!fuHj-49&L|@>)ZL*(b!sm}UVP2()epRsd$qsGI zk7&$`Z!GFtn#9u7&!4}(UVq!&KbW1P?w=iBp&B3|7uf!bsAxd!APuE|Wc=^|OMx^B z1BD)Aha+?6IzN zo~&WpxASjByEVSI+_SaXwYS@Mv^RKiG<7?DqU-PbD`#_!E8~UKnf#^MoaNb!C34ahr&FjiDGM{H)X8M(MB>7D0%anB zg6Cwy0&2lHU?1QgM;VEoABo4IjKs}9oY8m+%E55L{BXkDaMB#`AIuL*K!3tSU&8oU z#>`aFe1=a}ePQeMw;xv**BdJ*l%eh6s-?cHIW+APnIMa1M^k6vgf)^lgEO2kI}kfF z6gM{%L(Xt4WjJPjI1W`{5jPQB1js>ANTv?s7LYXGmoVE)3sM?PnZ^CNF|xZie>BE7 zm5G)2x4$00WMh8C#Y*IzM5RNPbBTii(<|6Mz`GJ!(0{)83sV3h*GEhkGQz<2)0{0q z`=H6kYvBKX$T)z;`D1+W{7>u!li@Gv_Ft3E|Lt>B0Ydwey8~vy;Kqq7+B0({V@%a7+$-AMB*;VP+Noxn+Oa zqbP>kM4sP5RoqdV$3p3IT|!V@nykH^OKgB&Nh~(P805II?+}I%Vw&@q^HEBft>{@CRJHxRoS=j2S&)FoEWVHh(q29 z&IeWCF~N30^z)$i0si3piQtp$e1Y@l!#cntL7qnfJdaTtgn6+hfLee;fZGAAL9qgc z<{!gf5&;SSe`R^(zr*$)V_!aFJpm&<@IMj|f1(7~nTgsO!Hn7>IV_~5JhrzEQSbBj z7gHDeg+m=Jt8);9)GtpJ&kmK$kL1k^MD{lLG?t*r_iZStSetFyUr!(Fw$Dkl%}sDB zNp~nn!Eq_ibS$EgKP9OjX;WZ~Q%V0%JD3im3b@qdfk*OgDIxn`?Nz>r186EM-kd94 znrT1TuG?D%;h#FzUA{5jbhuWwL5b{diUA8m9Z#DYK<;D)WyGto*gPxBK0luDKdIq1 zX`#01V1Wq!8^!p&NB;Q6Zo$~$e)ii{)b!v!2GMg|KHn2!NXG4(@e(G z+$hE8b7R(*jv~wKFsHHv5a~rLW1kxHq6S+F*C))gqB-phdF_pbJ{a*?>F`_Yu<9wl zR+o7yEB0S8!T%ePeERyL-u?`hcK=e*ersxPlvy4*v6M;OsXx5zzWv^P{k>}Eykzq@ zxNX=lDpAu0C3-#5r89Ib5th zSfV|tbqDjcyYs}~U~{}|ZKh^*xp{l9>twTbb2NP<+b!Q+FTm5#|C5=wzkS$b$NXZ? z=43S$(x8o|{jHY6o$iyJ!Sn5r)4l1lL+mkbeZ4roxjestoeunbpgtutXw-t+`^)`n zYWK!;DRnZ3I-O3PO<$Zzq0Xi(&LmT3k{6~D<|mVY_LPal`SFDL@%Z_%cs%FE;^s!l zp#gpjo^v>(v2!D_S7+DjizlNkE5pUqp-hyF>A|S+{+O}8sIlIt(e8+$-l(y`n8~5o>EW2!p-5=3 zW`?5hVsb0sVvSPk7h=fdMgMtsv&Xt`lG!Rp1rf zpCsh{>3?Bv`GSQ1BJ+!60l@bLqW2dt3;GLm&|_RBi03l_e>vl5L_r`3z*}r8s%DB+>ta{AZKlXOZS% z6sN5KOL1cz4CD{?!njmKnPlPr%nN5xlP?aw`O)S<4l=eH`hm8&V~y{^oL(t$OIT}` z&2_bJ&6Le_8iqJLm12J+#PC*<2j>3_V%%><|Ka=~FA2^E z$Pa9PDlYJdM(;oi3Z3UuVaR?2(D|bTJcfu@i0@B+E`s^^5>K)nOb);w7I3t%U8bbA&*}chqK0b`RViwViJIHpNTwC%38?ySalHvs<~3sb?C zIG4f`EDJ9ji&7mh2q?yz&;q49(w2fT2yj3&7_8wc(qRYcR*xYq-Kk!kEtnf?++VF-Ul_bP?7uwBm>vl2CM;0YPzxr%)jLa-+ti?rYP*7@4+RMy z^5U#g!feyRty4m+;s2Qs_>T1dg#USmJV}E>&q>EqNYI@;-;QEQhX~S)4yCdUEIcB8Thz+KPg^E3pIAaJ-Z?g?WAE zhty!BFgNQcZ!rH($$=kJLO$ihy642Z=Oup3jr)kDxy%^X!j$0JqS(fgy#5x--X`!L zXnuTpa`E+&wvq%XJr=aEoJD{V{0*|wHEb_2r6PoRymW^`?W(?vt&-lbx}%Ln=eEzPEb^rTKFEKJ8Q%*0cs;^rp-_3^VbRG%G-C-6QJix=cI4ejSgW9Lx|{{I8; zk9qhKHv%;6Q-g7n193opS|N!4|5*ACud1_b&3|F$&AgfE*VWZkMpQsVP;!n6N)!+g zl%PmfL2{HFFFEH7qU4;pIY)9vF=s`zEap4cx7Jy|zFa62?6vnk-~NJtSt8(+iUc)c zS@TkLWPN}2*w^Zm#_+iY*hOan4Sm`iN`49&E>M^vRL#i9y3qG z$VNz>fSx5}WQj-@z(t@4pwl9!XhGfx7P#e$EMl83q85qg3IvQY$!rO4m@-3a;#8zH zsh>0W*D(bJwX;X$TVOeFhsc3{CH#WY}e>Gkvg)KaPY)^ZPekv+f#)IJ%?;B@dKGHD)=)c-h9>aZU}s5aScpm>1txaGMg7 zF<5=4B*DPn(Kh@>cui*Q++(K*Z$)cu4F_YGKcL71|HtI7CU<^NG1FAD(j{`>%lbIz z5hqPmkD97ni}CK3jz5;pq_pO1d)cacT3?R7-TRz-G5n@spo2r4uVd`(A{Z)GrW*J- zAawquxz;J8^8kMobk*b*KnU4{1t@+T_$Cn{FxXAFE0L`VLUs_Tj9ZoB3IEm#tvfy! zlkRJUTvzh2)AV!I@VugS6^0CUXW;e>hfiw+yBI_Hi~5g&|EQ_npN2Z9?Z?fHq3y-+ z57_?~;1BTsh>5{rLp>OQ0`@;_q=QC4j3D3w1QZC|A(+3(gWyT{FRA~?l)Q}L9})17 zfa!Q#Me*0Y=?WCc*w@1%z{eu+mQ#HAWB>6cIQ zPq$azzm|S_J-jhrJlmf&)tfWbn=$gJNlc%7x;nPC+{B|Lb~lA~kQCtP$Bpm;jY8%- z7QUTTcoVmPFgSmr_;*wyAdJlakD(5(gI+ikOM#yHxFHZ%1}UuZ3L*57jP^D0(5uZV z&TQfIP}iDd^34wY!^>f?u-6y6R>hUVxf1qN<2I};QD;fK2iMr z%QFMYGj1dNxA374C_wp%9yxK>vtp3>do3f|sz_;ge^=kylGK3o{YDHU5qHcNz*FJg)Yx%62VGuu8gX5q(F`-yOl7 z8aEtOTx=BWEl=879x_`pM=RYhi{ZA|Bqh6ufiG^0Bt(Ik-*5#c} zb-nHlz5X2|HPZE@?lIelxXWRoMxNI-uiEN+zzGENza1I-2?}(X94v@kFY8>ptnG41 z7cbBPoUH-=7+km4^RQEQwerY_hCf4%V6u9Crdl?W565iINbby&jM28(N96&fN#5BJ z_sUXX_#ai3b+07#etDK(aau@K{=?q3{IQ|R+1WZKy>4!{WT5{EohIGh`n>-GD9Jm3 z(I8&}(f|GvN`)(vULrnqTE)UrI^z9eoIFO4j3&8$&drjr65_EijW`ecG0 z@IsfdHeGCgy4dz?zWwP^*R$2ZmusW1)+S$Wv)*ir-oZTc>C*e>n;&29lElV+D2`w4 z%SKlCt@F~BHEG=%CVwH|ouUO{;k*b>)c;~K_H&D*oI(i>t3b>u6myFtykfi~xHd%q%`FjmO9k zGBQQ1Tq&D^uC%~K7XTPlg8GkT!925ALM;@{Qh2xm%$4vb3R$=UjMmTHaS#6IzcHdC zoE^vvncIQez>tAJ){4i#TK}c|!V_gp{wAS%qMBj;Cz-Y<$jtu-76-T*5Fkk5p9)BU z!Ce6O&vDGXfPFyqA##9U9YKj?0iZCV{-4xTJ%Lmjn18C{o1Z*(Uh#;QvQJ!4Msu-& zul+f9OS2FcpQ?Dj%J_`o>gXqw;K~GbH&g2yKEM6Md^w@%zrGyuKScm*~Q;E>t=e=QD5Wc<*O+n5ly+)A?~Vn z21oQ&6%94u|Dd3wrf7Kn1d)KjOiu~FI^aL3`Gf)lb0qj|^G~@DJFZ zxc$ia|A75}H3%$)VFyicA!xzym7oui79ghp!65qbMdUvs|CfY6%JF|v|H1$9Mhc{x z8O$F7Z&?Q4x|ST{loalf6_?W6H2ZFIYGS*VC12n5EW!?YG_I#Hwx>C+uO+m-8sL8@#9tkx@`Im4&ZF8e zXo2O9aFN*mb~k{!4{250a2p_?)QKmVGySzPRu?gMly$6&OIcGDoY}TT{^NC7ixMTRe{}(%K)S9-f+I(pv;Z3|*Grnt7xnPM#ai#0t??~qEf2d( zk+<*Gw?3T4YsrNO4+FQO2#@ z%#h0JvKhv}(o_2OhpENqGfU4O(S$8yG~U9}C*qd&{R_mn1RaqZVuIOEm_0-~h2jr~ z8kunZ-Rsw&a}s(bv2Fl+AMR>o+Y4?FcBxQyeR{qBVg(tFyRxw@Y44^8@}-V#X$NZZ z?m{bS`|d*1vxVkokW-P=0=!WVVf)Vi2(E*TfC05}f*#`IfbX zmK9m+(){DawGjwiXA^yrr|PF9!>gRmC3gLyuwhNsv@Hc=ziC_6yfxpkv+#HaX01|0X3IT&*QTT#Vov2AYv7YR0f%Mj8sMa*0YupqPmHt?uYq-D&b z{RR zN=IDh)2<{1S|<)b>Mt#3Iv+`D!$$kj6~*uvkz zKK@2NY)tnzN1w6thpOFEg8Yi&#Dk$92%IL&?+6jnhBg~>B2Jd|I6dQkIG*cI?X&h|vL2mVj406_kYbg}tG z@jqguhXz52py(HJ{GZ5&tu2+T5j%TH72pq&UtAnCT(4-mIim#_-}XTMi&=oDso%{@ z_xzj_!t7)3-mlGX63&VL{xtn;ZF+rv`4gxaAD(@D`|Qi-=YM}+`u?F!#4Kk|!1=k7 zIzF-?W$bQl9_)c6*|#XJppC~qf*U-k>fq$uYc0DESf-;Qv<>q=Ov!K;AYFjSfxBuW zAq0C;AJf+uJJ^ymj?Hfu6a)K)?06n-aGq658q@~!eDerbe zj$cR7jruG*$j8dktW(0w;)3);y$nJ;&*Kv3YIDZrGH|?;wr0mK7-2jAA8M+9SXi9* z_C0$i=!m<|(d+)dUA=SkPJ~iirgml z;i`Yr8C}50%URdmUiZ4a{4PMQ0Gb&4aRqS0EdZ6@224?XH+w@*$8&DhmZ3Mp>hse^ z+H1{=Ho|#2F4*Ykr%IPM5O;!H+^=6CL?y^R4ju&J`Sl9Y)Q?}Kd6R=d~?5YXq-`|r=!Kdo_INhfwBy_@3hr|`p+wC_q=p2?b@&bK@xgS}iuJKwki zc0H>7eErUR9ccF33w2xb^;`3`pj>W>!Md!4kakrFAyw5fuX;&Pvm~xxlGHDWtLMda z;KT42x)&yjhEi^)(VD2zei&e`uxsHJzAmoa6xVNw>bB%BHpEREA}D7cZ!M1Ou1sM^ z{9>K?VwLm!<moH*d1Q_G_#S&hLm|r3ilu3ByKyQT1 zV*XqnXC{kHrwCYuLUz88l_$hB&dL*T3dC#_{5&C>BIL;10X}3>L=1dQkr3$pL?&%G zeRi&ZO)KOw&;m-hxD+r81%gWPM9xIAd%9#uGT$xf1q6AuFxxme&n%SQ8~mdc(@W=$uv=Q0GeOd%sj%r20!im@Y>Vp+@v z>9k^=ULu{%6Ot=HAs;PZff%o4Hdm(B6gCzZx{3l1=LFSw1ox|VITxhwm9dNc9;5EHnPpuzhkTHWPCaNW>jmA zUEFOgj|+;n+Gkvi&BLy0-MVzf)lApR#xn4lg}<|^ouQJ6hLWMiaqY7T+Gl?$e=+$J z^JiRnNDvtD0!2H(>ICvSNUeWYK3TsZ$fFL2w3K0JRJ>|^{w6|rk;ZO!#=%P21}QD1 z_@nHTTY#MKNn+pSCjTJ$qsZeTfFh5mFVuO!K3EDIF(Hi5BgVSF)M1E&NBzel;Fzfq zL}AGP!tz)7(ghfSp0T|I{0GV}?dvXxfI8g+DtcfI^pLHny;XwGo{BNze+fsJ7x$ItR`L9Jl7<$1YvJnRU14jr5 zff3`2H2H^PkK%{g)2DmO1#^uH>VE~FTEU@~GABFM#I1{h78z$?bEQSX>3h1| z^K?FEW*}vv>uy_FU_)VWQ=xx#F7#g@fBKcC-7ZS;DI&!m$zL%4aRcm=9*N=KHJL1b zf&5$n?I$6GApcPQM)}#r`soK;gD+_33Wxe>vr#e=*InUJkd!goozEM|W)CDzJxZf@ z-)SqdP7O5-zhxO8pcUYzdD}(F>4J)r)d^ekQw|nb+2Eh=n6bfcdb)~ESI_$fpSabu*kIbXblfUm)(jumE=a3Z?9 zI*&b2E}e{gTpm!H0bVG)9fFIJL(9_RnhGN-aw01W6Pp?%%Ik^;7-K7+W|qFz56)M2 z@;iqlJ(H6DG4|r>CV~!0ttYG)9Qo)^nDaQl2%bOQzJ9kLUHI!8;q~CFK&L^=kW>AC z0swmdVh=d~!VHY)x5eFCBFy}cb|r1Ql9p$pMlzGj8n-dqOB=SO^;@zA5bU?->$hcf zTe4bctTtujtV?UwCDky2TE!7oFAJ-dg_X;K>LqdAinw-3TDK&v#)@{4Un!dJoFC5V zOSzfKZDui=B+P~dS_Np9%S49@H-;Lb%!MGAxG^-Yi`q7Xog45Dg^%dU_|w(d-Ce<( z9mWf0g8*zC(pD-K#N|MHq@q#@uRzEt;IJr6S~iuIJqL*et%$)Y;j+sK6hD*0n$70S zX0TZ~fMNi@2ymErLMG`2XaOR2zL-f7;=aH@rzjARD?mP{H*st%eVR&P(I^~RK8Ib% zXBF}JM9pp1sl>a442N!E$=zD+}sLsJP;vx##viPK{-qmS-BDsn4|HH%NR z&S(p0pGiUsppQn+VE&&;PJ93CSOmJRz}w3kn;bv!^k^;tBvRC{Q3m z?}SGL$@%Ew#K|>A5G69SFk$)Y_Q!+0F~MYTYIrAORQ7SBe)e%( zZB}G;TDx?-duh&(5`8@}sCx9#`d2t4z1w>8Qu=(gnffFkFU&g7`MkZpo|DNrE1h%J zx)}b?UC=paWuOiTfEDq7R<<~=YK7;y({O!A@NMCb)zTlM{-3ndaftOPm}_^4@;P_S z#5lm-Ai!4Vj?J0tCW=l5Ru9}QgIzV;E+S$87I3G{kpHWW`hN)Kb?1~xyrzaKbaVey zM40ALjQtQ({D$8Qs8Gm-Q9KTDtMUCnt&kgff$q8i?pn88HE%eoU$s-ca!JMEqN2?& z{0H@)D1YJhfcgIvn4ji`Wan$5f7n3h*IfYh{}A>9#`>fS80iw`Cs_xe9gz7SE)Y0a z3Sj?>$`A7&;stGEg)K1n{|Fz^M*Y9;qJP6p=jK&N0Fe9(2*@rn*x1j*B`K^%I916U zi)t*dWlm6cR~FvA*!}i(=f_w6tDUN;p^SmHoZ-i%2>)8(b_!Wj+e?ezKFoi4$9}yt zxW3Rf&&nKo9MV{NzYUmARcI?gevoliYVpMT_uDJOu>$C-k=p^m z9l9xTtTSV-KVzmJJkOd1M*oY|!RKpT>*8uLql7V8$egGW(;H;$t`%|5%6yZE0f)M# zMGnB9l*z6z_)a$!1vljfknqPWn17=9-$L?lexfImzjBG}7n@%U|E{UwZm9(PaY+hw zPPzy1-!>+|AwI|^+TS|zw((t$yA65G!r94}i>x2d;iwtfSd=oEvwh!SUAj?|FY8NdGzze%@!k-RoU>S;Lb07FB59@G$VcZs>hg^SYhBkCWa_ z2c4S^+F%5^*%K`2IyqBo9d*7cv-CbE(##VrMJD~m(;{x&;+u&E*pB5R< zq{BO~pck}ba;wqcAZg*RsXwgeMCIUDllrle*=T!Vk_H3`V} zIF&1sie-`f2rCwa6$^sO1%4IIJilTd1yful6P8P*HS-H?O9LrA@mG@stvu1ARZinF z3mypNt8yO(V$J|zEUEvMYeXSiyUK4|6BEn0H3)}gJ?mR@2p8C#E@AMh#p0SpahX(D zBo!4)_{D<3=+T;64XKxN;!G2xOyd)+9%j2zY6I%~68fidW;kVhRG$&(4+Cf6@#1Xar1(fSE6(5Alxi8)+!1(Pj_g?T=Fz4gFc-!H6AlQ9zQ;kFgBSsIUGCG>erTIpPO_ct=^|` zB7R~zi8>ljolIs7wCnOSqdNc6|+bTPSIG_ z>`XbWJ@4^lONZYMA3k8OhGAtiaFFJWmCp3grOU|dGZ7q-Ay2Vka^uQHDz*b$2W zfIlSROJ4j@@KO8^ktb{)j{SB5l^?JVSq%{8555Uu{t%5AdI9*KCt#bPu6Xpk;wc?f zMO~FMCg+dns@V8AcCvbXV((OswLLrdxc=pNdUa08qdLwrSr2b4p(Z1%t5W!NYx(at z)E7%5OKk7F*u;)P*~h1^e|-Lkx#QsPwT~~;nkgn;m(SbjYTJYPqo)O`5B%RQ>YXvu z!joV@*7`_+hYC#1N=NgGv4)ee(QOCE7*Eq6C*wdz9ba3MyDnE^Z#&2NBzF|qg?ktU zIao!xYk66jAbQ}wyPAvnX(UKq&^@lJb`nNF@>>8>AdhLDJt@yq#%~D+nExLtr~V0( zZD3`JNB?o^Slt3Ey1V6iX{vVM^>aSXr=2fpdN{)NL7wV`#1`Z>nkw3mct^lHN6qxH z)jbBm7o4B5-Zj$2769P?DGL+$JP^*mk^CY6+NY5oF@gZ?2hw0@!AuQ~!V8)te_5VJ z}?rP}ePW<1H|9kre^4~8%@V^-9>y!Twzz$rd%IKqw zg4r$^o3XpG^>c6IV2|}`yL@)2XsWk-ZWxpQ_|v7{d0qo!vRlT*!fj%EiTUYy-}XFZ zZs>k%B{aVvf8rHsq{F9$}U9SAX{C_ny0=A#mQX;NC3?ume!%&x` z`?k@f{@ca`+QkQ1-1oYc9TC@2K^c2AxGR0M%E}ySdeB(ZvP7?+r{8NT3#`uv5%dZr zMk~-=|E{NA&e$yCkZf`XM1vY3I_{o7FQ*d<%dz`H7U?kn87 zujn6fBp~8qMRWDD7p$LuOMm>e@a@Oq=l#WRKg6GYFhA~5s66M)OhZ3U!#i%qes20c z&bppg^gJC6ydCvC9JI*_zy|eS&)vcJ<`ttGj>b0}O}(A;Za5hGyCwHD48K~;o9oM% ze4Nc6mMhu^r3$zOjBOR1|)O?6)Nedv; zJ}Lg9>J`YWq?N1EiWPAg!sC~4MCA)Y5HHJR{7Mfcl!_NymIso1 zq8wt`)pT*^GOJp~tOE5BG^h6nadtam}m*?sPe8Ub}KJ(Ey=LWjt6_gI3mO#Ji$7t1SLA+ z2{n6;S0vzL$%_h~!J%hz**OFVqG$6NIeZ3|1^EJcu7Hupr{-{I**sPuevS^$V9;<{=;X}!Fd^i~Sn3gs(9XmN0J3bUXJQy=J7&|@~KR%W` zIi5TZ%j7l z7JEz2*~G}jT*n^%Kf2n0dSKmfK@a4AjZ4HA`s@WA;tOqK0RJB~I|C&fZ5{UuNDVOY zcQ||11X;jFo>nnUX)!HX7lQ3=qCK2aZyWmAYWr9tUrg7-TFuT_*<2g-ANpTN08S7V zkor-?zMLoi|LB!CfX>iEiJu-&GB`pjpD38>dGdMz!|KIY|1+)#owNn=1E5~hZ=K^>9#aj2WsERpJh`_IzVaDt2rEl+7|N64_^Xts^a{fqn>C`|q zeY~1E)+%At31?%UG=lK+0Gyw;N;wczdmpyUqzhCK=4X2)4uOEWYNER9ArlUjvp^9C zlL!-up|*_azC0F~4t)>Dx{8?-vwN?ZKi^`iA;B{Gp*moqqWPtf8C;tHaC(du~IdKsGlGv9tc>YHL|8Y)4pUiAX6-Jrw;)#cu6q;xGYg+HDTZOg{rEVnH%T4l_{ZtN`T zJStMO{M`)hd1?D!S8}~{+U25(v(;H=E2Ycksty-UT4P6Vgvid{bu|B>rK{q0L-TH! zYH-xafUx5MVa_$}-S0kgzW)^L?MuJxuYLKpxxc@$|9$!UUo#)R#rBO_M@Q-Tx*Pi= z70yN5!_m;k#Q;VArlXGh7NGCpfTe)J4M(G!R}9byyzsB-XyWe{-CEW%PYFM2%abhAm==41$fk@{23iL={9@E2&x&SFQ>x zR|J(yf(n2z%Muj-(q$pIm!%7mGSq*WpiIiIkn+o!h?5sg*r601fym^#iX z};C+E6)HL)R3B5>4E0JLHi^|U`nP->G(+k9y z|Eak=@|U4-#xka-%jc?+YYp^F|4=x7Tv_?|<3|rE!@3!AEhV@*LmGgnN9eyW$6}_% zMgX9Y-0F?^KY-o|{{JuXk9_h++9MpHu^K+~e~$e2U&sIW=W(=>qkj^Bh{y!+HAMWS zLWX}ut+RM4oKpq_1oF>$OWmW|N*CNNh+ZvyIQahT!|T;oJL2t?r=MR-c9*OBnx+?6 zc`fC|y$$^`Dsy}J{lVX>KVFoNb~P}20N2OYXHl2MFZMpcv5>yacZl%Nb2YcTd0F4l zRMXZFrT+Y{{jZfFQsCkLtd2#noyl2iT{U|{J&%iqUYFDy4YjVCyCnIU_&J*1woj}~ zUwOB~-I6}6PcaL!Hww0ONW5hkijmAt+s*2fr8fK@-~xI~TlE;kzgpyZTJ`uQ2UHbZhzn8iv^(o&hqPZ+lzrQaC>qMp{9ZCUfrKwJ zB)LH0MM56o|1SrB^s&-avNThIw}ZLyVMA?V`-7%HR>Q_8(JxT{5efjaL z+SJ?i$q%sB5m9D`8|PV%mW2%>`r}33;Gz)WUoS`s@HgR`=k>HP%FyG!B_Ze2^U2+n z77@L8ZU`#ixV~mo`v)CWQIBe4U;z!bXGayfKnV1?ZRLP{2p9BGP59$FGXEnNtfwhs zrZ;`AH*TQi;aDdk-9hiC&_|mVx&6=A`ghlcpKr7*@@x2WLt9I;Z=Ov*-x}Ol8r@z7 z3+U0B0Mg^Q-lpiDy1;r0G+zk+^{*uLAO1gt{8>PfUvA{a-vIwJ6Ur}Q`v&|6;13Sw zf7E~AKbIo?zyh+0@H4&V2}CGmpgOd*C~u;3_U+p0!6)Xs?N-s;6B(EHwYq&3a;=O~et=G4!8x8ITX#2S7 zdcmU!89mPWURMlmIvIG9r@jZqekT)8XQLZeOubx8yL8BouTr0J=!VN=+!g(r%?2oCx6>!Ml!`|Fabb#cWSymW+> zOCmf=ah8aM0yMM5i~Qn6LGco=kPt7yy%&OzQzjLZOZh1NrDATGm|upStXNPko^P1v zRdM4S;-17lT4-BjS4g3Ih3guz;wdKIkbF=97u7?WEhFr74sZ;vQ;ne8y6WB zg2A-$$?Q31A;1$hyMQk$lSoP>;u5K-P$b14T__fp%E*T$VjhJ*6+hnY+m>%jNia-I zHc2aYt>_OQ1EdoCXha<;_VkQRTC;DPW`XYx1 zqK5h(42;E%w%ln+vUphHRz8t1Jsvwd5jQvYkTsLUnoZ`AEkJ>kUV<(lCSu_tFjp5? z1yTkmOgUU?Hk+Qy#Z6?UVCHdt?{x>y-;NwTu5?;iL;bL_;vc6Jz|zO?k5n&&1pvYL zzsEuTCkD~j4v^F^5(;wyB^{VQ>OTg1GWjF(3;xd}|4aTp`S28W3i5Z3{R^97B*kO+ zS5;KhP*v1`0qJQ)4V7c(loT{ipEJ|>15o;9ZO*#zvx+S=i=>M=Pld-kHf3dp$;=Og)M>SX5Q`Tho zKYPVm-N{DzGORuU;DGH(Y&=QAFR^;V=2r)$9>zXOkN`mNYp8qJK>MhX9_|IG{AdBB z7ho4)sEefl=6})xAP^%)aJT|kV*h&v&YvLv+h5jlcGPio)^&45{WtRVFvjxtw&%s5 zI~POzE{6x0hu(?qs2+d5_GC?14a*SjR2F?GY3xxhb+7|Da?1kt%k8zVAGW@JezyNj z^yc}{JnxB^Ik+fT`1w)t*ZU3$yM{Gg!JK?J*be3=>OWwA+yV#%2Rb(STcEOeS z6!yYc{>H)o2N!|f=H#)?)bXw|;Y=BSrjRq4%NWU?>Mi9>SMcU4`P4`2lCgI?{ZE&g zCG74M>CB5Qw1CO2CHlMF?oCnJ*yDKQ$aGfvLH32XbKpOf8F$Lkd`nWn{P%|Kb1q^2 z5ZNy#e~^FV&Tr0%_igAgGz_%*duR61Hkt+K3V&mWo>-9$V z&$-#0ak{8>1>WPxTsA!m`|e8? zN@k|VjEw$M{k(#mi)qwDz4%n6&^V3w6uYvfT=w$Nn=hR2KZIZR#h>@r_V#fL5PteL z_j$jJzi>4-SNE2Wf%gqf_bbSTHuQGZyLrXX%US=1qoJph@l9t_)PIjFX5Ox5KCZ?- zu7mYodZ?F z%udeI=)x{_{ngCE4s&5wy!wJISRERtEiSIX2ov)^0rkQE1jqwtAL5?|dmjw?KfZq0 zTV7mwM?9bZf^*u(Jw*M&xB2_p(o4?hDu#bS3lM&AZ&2`&ezFOVdU3;spmsx0w=Sr` zP8P1nsQIvPTIH863(Co2S6B|d{j#8VnNz&TDqbLJ)`EF9WuBEMVN-BKf+7t3Qb7s$ z_F_(nP*5omRiPIM*@awDEmX9UB5z9mjogJMiLeefn*hD%iAxVD{tLhKu>A5x9_l{< zLuAYn89W)7^6{8mBjZ*}dy__o633>~sI)95E02xMub@cC2fZhY!^&i{G63vwS=k(J zA&;BSmXwS55acFIb=+#szL*uG6_;k7+2YquOQ*5(xN~XDxl|@2lS|J46oZn^qvvpG zIp_lD1uRA`XD*Z48S;1_ewdbv;!lQuRu+q$$zBV zBZCoRec>bh(PRCwqy3Si*h*mL?|abS|DdPTsVMnEN^e*n^&x#Kc6KtBI-A6pd&tHj zm_`xd$7I4RqDTg57_VsYmuh$}i#waiq~&s`NZL*v8!H)43Q9SlpnUk)Nk!GOe<&y% zR#H5vuKK4UcC||2g<}3kycejUxDFup7xO=W9rzpke(DIpe=yq77+I)jp}Os%CL+oIiv5 z|Mc~X=bzq)S7fWZn_FMr_A6-z|N3>Hc*cCsQLt09YGqUN(XROvl!gfIn7-PywsqE+9XOrkWZ~uzj=9 zx^8LcZL8*Ld^y6?D)hQ@qCazY{_S61p6UGh1V`-FrKf?e|)p> z_T}QMSJD^HHoksX-Fpv?5c~a$fmLa{jFUgrAK6j&pra;=4EFV5ZI$<$OYb(7+-ojF z%?IF*&2JP;fv^Y$7SvV-kI?9z#<;%Lh_3qFnZ8Hc;`S9D#J|a7UHSBpa_&?SW3+Le z-MYv_7Fg?wu!=WR&6ye8l+oWj6McFs{QPG8<$Aq@o;und1m+K%-)eILYH|qqrwrtu zWS_z$tN?BjHr3chxM0S=w zS!S*reC!u8!4vOf&sGlgEdTh-dbJZ+m|=0x$2|15VekzV*UMP`>fgGm>EWR2Y^98_ z&I<-7EYW|BPg|KOnVX>n{MY&O|65aA<5r+qQr5Yslrs^DYEh|nC5|=iKdmav%1th#G{9$hNv>&Kxkh?H^x6+dE%i)OK+2;ox9gEJ|-{ z%WChWJQ*nIAFmsujY(En8?TugFBf0DfA#tM`>*@2-h5tI+*;ds`uXEm_~W4LlLauL z^^i?3J^&sBUGLXVd#fvJ@7}$K=Rc|cU-#hN{N~+PA$5!0zas3~618H^2gtLIBf;2T zPhzl0<%eIT+^iA?HN+Drl1-oIU-IuJQ*O)ohLQF z6fFSX1g32ZoKhJFR&3ac%IT3rmRl~Nl?Wck4vwTwO{LRk35LU_rZI8mQW)%P4kt&z z1H%)IAcw=u<1n(AAO&%YIItk(<*`S?`fIONB}W%Y;mw}o_K0;lFO8M&zZY)(3po=W8vuxB#HqfJB0ujdU# z^*#yc8hkJ~6h1Z>Hrn@Kyf=Kf_rXwKcngktS0Xa2}tprH{sg3AAk`~&`{oc4Jb zZzA61Png~xBM{KR85Z=0av*jtov&%7{%i#a9UYGw9JNT}`9zI#P67w)>61v_eaUp5Z7a`FCk zEq9E0CZ|j_mCba>@>f^&xSkr~z#svJ1(1T48d?C5A9;)p$^SzA$8QY&Z?OHloDizw z>3H7j$|*bZ(+*bZS8(qz2gwI>JJ_Bi=N(bMCVHsqsO?~N;yQrW#ODEHzmd)%J*{Jg zx(e7180lg7CpDiW{~D0WFSmfkf*4Sq~tC%m~LZ>InLv4uNL+{NcY}JKEE1Y zm+)TgtbF;f{NW8}ePwI!OvSaZ6tOJt^@X$b8I-c1PeNv3&sZKOFe~Rn-54dskvZ9Abj(V}tDDf&l*8WB(iB z<3Wj_%ysl^usbBQ<-gvrch}gj)+fM88R^^ndv9uU(d}WR`91Fo4}5ieuc=+P)An@I zzUg?z*;?7b{4|XE?JZU9E}XVTn4`6lsmXCegF||H|4T*n{~8z>-ixtF&DVdJeKa^y z=|Q4HZF?d|*8Jk#+_!z{&;7-p`=amr)UW#^@4vTi?A~vBtQY8S=c+<())7cQWfZJ}WS1;elih~_~1$!#0vw`t!{msGOZ~xj~*xLDk zqJ3~6-F=->RT))M+Qnt@o;?$6Kjp3MtiF7|`uyF>?%QvqNBsTc;OE~52RLy4e7^N+ zS-2wOEIeBS7W)x^51b$1n@KD_zkdJx@!P96?>>FrgNG+#+&_K&_WtAE%KS@O_dLKK zamN;-&w=m@YgXj-A0a6u28(#qR{(xrLWO4%I9di+hE)Dye7L|Uo~OaS096{eO%(=p z80kn^`9fyCfKw#mLNE*eoFd4t*r@-^0xr9R$1dXuDn+~s3A;ofsmGK{O|wrJPUv1} zUSL;B@Sj7g%Y$N<7_tEXky|&woClMCnUoDfhI|nXmIws`q_Hr|L|u^seX&D~Jl0G) zou0{JVo=Xy)6-dubT%Cf&nyVCP`5es95y2xRh>@Fq;V;1K@m?@Bw{4Zwccz<)=P@f ziL3RfnTQ+XVtkCfY}D-xbREsK?MyXn zjEVmPkRL08{Gc5m3trVq@4SQYc?SfhYihY!WcF2bibm7AOYP!(ZR30{$G~66`N9Kt z>o7NiJNC{Q!NvhD=67AK!aP(R!P3`Jxu}2Ug8p$mtN>Jw>z+M)9{FD|e;_W0{vvmQCh?kz#~XHpH}exMB7DzWvpH#Nq3&v{cEuX=zY;t@t-${=BWYi_1;{x+ zypWob)_g&2D>I-0`+X>~Dy#ZDgRs!!V!X^sv^_n+OwR z4h%e`U^La0}7hb>I`u1_@&O;I{qI~6mgB{epl=)CF0YC=ja@+NJgZhfr%(qI2HFw+ z7}i#Luc|k``c-&1U)BJd*Z#t38~o-?@voy~X@1Jg_^7V_zs{ZeUuVz$+tTJj zLY7Ht-ifdTg~+7;3VdKtS{*XY?Rx#0d+?KY@HhM5Z|dJa2R?jz{Nh6ycg3T)LND0Q zB>1*@pqGIU^x7`Q-oWl$fccnuUp2{{8L! z_wR4MecOEfW?^IZ<^JA`Y$=99De7oneE0m*!A}fV-wuB6AN>6A`72@Y6UFY&pEw5x z2Y(%WdH-!=ev3KA>uVaKkFh1}`9=Q9s%&Fpesg+1%s0V-#Gn2#4B2QWxi=M%vWiV0vSrkAz zOlBU7p3OkT78UR$1wzKd**34H6ytTa;l?zGM26d#yte1H%!c1NTS! z?~V4~9~lT8?z=zKcW+=IbYLWGa5QqL*0m(lDs?(;l%7JLikY2DV9-$i6B*Pr4kJ&@ zL02u1VgASPPy9m33P3cS&YVh{o6Vr%=bg%&94#0Ry&it#$jN^lK6YG1`G~U8zfT-J zEU*7$9efsBV8Ur3RyN@OBMU~(>PM{kzfTiyf7sm+%%5}tP=k*C0q}=}KVp5LfclSf z1mZIJJJ=MUH5`NT3n>64uY*z(jyTKBa$Khs-|SL6L% z;%{lYnV+*W)N?e~aWF&vyDD;fFX)ns0D>SbAqp@!b5Zx~C4)28x_|1OKI>p$6X9_= z>c;hqfUNP_2hHg^fsV$ZE~l=Us<@e-b+GX}943l6lbuWi=H|^E0*{WTI zV)UZC{+lWz^To=H0RB+>$|*f)1eoLx8EPW}0F~qzTp)-F*a$!n>i;2fL4fCvE-nlB zGV}sM0U}voMERv?3FIG4AtQJZC`0^fV~yl5bw~J#IRgCAzJ?tlW=MB4UoYT47lLkC zhx*w@1>ej|x>sN1Rhb^xRM@*CUHJQ>`0aE4?)KJ~PtU%6efs_D(x^nqpxy=8%&I`#yRK6Jh~;RNRg>|aR+{?@WzKoDG-QSC!p zEAF?KCk}RyFMd=Dv!H~&=0e&i7(RU)vbF`@$n%XxArt8{jZzkrU)dAAW$X!r;Ia4K za`)eKE(;6hhHH4#jx}L1b1Y$~8RSpTqLkpeJdi*At1<(tvrzwi@{_Rq#qjR|Qp3Ww>+{}I5&3&&Md%9TM zzHaX4uH~#MeXOg$fUEYvwZ_e+m&F{$gt0MLS zpCRE=MSQx1I>Ka*@K_@v&bUM{vMA_Z=HN0`w?Y6P1S8h2lY~U1;#O`7%GUU$E4-2= z9;W@md1iqOb%~xU0pK&8BcNiouaQmUGAn{wBCS#bbt1zpk~3_JimugGxHpx1H03#0 z-Zy#}pc`9$r)fH!%FJPda?b#Hz5w_Jmr=^)Rtm{opjOZu)fR2}07L{~9SB0O;+f|b z;K;c0(uZM~g-IBc_##{-a73j3mk4Np^vi_wB2H6q=cBM*2B7#{K=&+GHXFA9ax&SB zO!*9-&Z1?q2xAk}og5ZQH$KbGW^uCUvLYcblhJv*Dajx{MnAUtM(tSqI165F8BEOo zv#BWi9K4=NrJ=bnv)OYGsg1r(y-|ah|H1sBr!yGobY>a@6eD&ngO)jw@09XDFQ_%B zq5J;h!SJEJ(BXmm!-Jv2gLvK>8V(;DxIZ)!Iy4nG(Q>mY&LDCus(&tpIukoHn?R!_ zv1b#QvngzPwt$Tv83*oga0<;Qw*csoXVO_ysnpqY`b-9O_~GzW(R7A?mXd<%?}v|` zQd2#CTImoRfleL&$KgMS_?M7&Kxl;Qml!_(Mgm_D_>NRBJdgeA0_26#QL+(6aJ=#{ z@H|oH|5PTo0FeKWswn;&DlmL2e0Um;bIK>wm5-{PgaiP}-{TreCp1-53{gv!3|vfV zhue71WRHZyDLrKn{NArijc=m_7RI?n-wrE&I4+~6H5XXiaV+kxnO@`8%{?BIQM+gQ zSR0bck=8p|Va`#vZlnb2U$=t2r_L2~=zq`K8mV8>Qw8i}sU>%Q)&laQVQZ{LT;TN7 z?Todqnx1hoRCd*XHg2;}B3sHB} zJdrgIxBrW0onXs$QOO#KEvV|i?NRv&;IDwEslI}xA&UPW`kHWogP*`rW8IVB`9R(U z!7nPm5!#j}K0IMcL;;|hlTX0{4$5CsqmyPPr!39M@DK98TmqnKYpw2RqkhHqyfYG` zuuKG=>|u7t3(lV=cWzt?^S6x%zEzNn@Whmnw!-Ot@%Puy4!*5?dbhrZz>P0kAK$+{ z_(}X9KEIvZS{PauFm|`tueRp4SGz>)t_3di{eWvQmILG`f$yDFkxyz#{co=#{2%Op z+bbVn{+A2Ea1j7Hg!&J6xQOn$xc)W({z*ffnG@aJo3h7Xh4AKT1hlplQMG^y32^pI ze<^3Gm_E|ADufFhd>p&iWkuAHCNTpv!>)Bv_H=g$#J_dT=Gmc)&MN8NOX1DN*_E)EL3{}mrIwivP<%Nz7X~UYdVMEe{81yx6*$Ss{ zm0PsJ&IkEqo=K6h@@33CDI-@plOdQ)=T7CaW(&DZp^pPi;(heP^L%Rhl4jp^ej3cBP#Hp3^vpOAnMPiGG-srXz8f)v}WJt=72Wrnpx;3nRIp*iwndl z1+Wr}Q-}p|ZJ4%S-R+X$xZaW2f#K-k(WtS}sL{dugTrCN1NVmd1N#O7dS+rLyKXnc z=!Fl5b<@*mfPki=XXauVv+?xlMEq?zEcj6nvuGR%@d$-9I8Tgy#8e6uod^)n_`|W8 z{He-_D$TP7|M}bRr_QP>pHn*w{|9K7PQcswD3N_Bk|-+>T2S-<3jvWB_2KYE-6cB3t-n^ATs*{I(OaU38qyA@zdEk0$b8Y>)zAc=jS8 z|G@tfUEu5`eYHz^XRLHI98J$%F|xhy>R%FO;Co5IO8wvF$~o*7hm1hY+ZV0lZW=#; zivN;FMkw{g;`jpJ;S+$O9LD6gw%tf_2#?u4HDQ7skX|BU3X^D0mQ99Abbs*p}Y zF)d#KAWT^ytfR&{)?e+$Wo3Iyts9P-ZuV*pRw|b*lz{vbswc7fK^Fl3M=tvU5r`;% zj{x>J(81&n=N|=Q1CW3I(AB{F|H}&q)gGTh@jnJFFc!i3I>(Llj~g43&97YfrE(dI z01NDYq5nE#Z>@I4=A5g&wudufzl?9+F!T4i5Df4q2;q-cQp0^pGI}?Kg0HVvzJFZ) z`bPX3OWyZS_dl<{djs>gmw)|ueeiSj+yCe3t%I^`_jcj`zS*;9&#rgvcdhk=J{H~G z-Q5C;A{~N=ba$78fM9@1h#=i{cW~1sA|=w@AS&N+@$BzgbImzF`JKP>$b+8w zPZfidkK=uH6MgT;nC~Y!P0N#A>kBXX$zk>HApU%edVf~nw|)q!dFfmB>`7Uk&+9DD!Zi11$%O15ng1w!OvU66 zh4S-3S_EXDb_v0E;{)x$|6VG8tRf%Zj`9TrWD@LY67mo$y}IB1@Y>?C5lZ{Q=h4HB z>C^2lC=eUV+h>NSf9y>hZO~=PY)7?SW%Te3IUeD7()Ab%s z0X@$L2HuW1gN#GHW9#4K_OzA_4vy|^ca2OAZLEJ}GE<(HR8z@a{r#hJi~GoC#{N(E zbT1RzPLb$&cJT|x!H?~=&3^j80B2-vc@t`$A3ss=b%FXWZ~;&N9Rv3Nj?_1F6oM8$ zM@j9;*$*f__cu=$$2WRw`^$4%-laA%%LYd(#)e*v44~Zb_0-TSqLiFd@TD*R3p0C) zO@xwtW@b$=(#Ob&Lp`x93h2~=k!LQYmi*4aCP`gS=}fHj8H944k^lyiNlIe%#?yOa z=?tvdS^W(`EwTEUPw%|IWQJjuoWaEWr{}Tyia7nn$WrDE7jw!V76ohjaSB)yC7+nN zpb!2I$)6zh-kdR34vv6P1_pHw0(nLd$N>DGk<(9w2q%X#kUQ8M-d5sL(HYjwOa>H# zwZD&<$ifkDx#t7VA<%mO`}9(8Dm-f^w{1)>t_Ly0r9#i zAD`4Q)0osG1}T9-O<>UzS(yK{L@S2^@V&WWu9XO52N@lWw4rMR~ zo-rsXtr^yFxpz{^yk5L>E2{E-*A!IS9ogOy+S(G(Q2)5DBcP?tyPh1}@zL{LxI$o) zZ#6A}+7;a06GEm$Feni$ax{aQ1j737vVbutsR%I@(HAfZRT3$lPL8Jm0_sWVCS`WN zkEycMwEg4Sty_XZ*Z480q2%WV_K;gp;{09r|RT1ugab5k5@A@ACsENFZ$^WMy z&H~&BUpN%ZHmsoS#R6AH!czQCv`2 zoJU4LOh;POP*%&?$ST5F-P>IKp+!(dQVyfiB{wAMT~6mh|JaYkioVv=>StMXFPcWW z(yO1>(p$fsZY&+Fep>pn@O|U!&z+VrviYM2(0|I9qv}^h&RkQ*SWTSZe-$MS6=ltk z2&9G-2n>IIO-WIG1rY;9UR3S*-_2-$5&SMu`mVZ^jb=i3aSrW+QM8kJnx}}fHjjlu zKxz8Y#p&n$ZCwv5UOgE(OHBmI32Vp+s7Z1wh`|UzL_j0sLPiWMFcJGH$bCfwp&8tN zAr2aM0U=(?*iaSk`;zxe5cnW>&qB(^M8r&oM+>>ls<%|-G5;a>=f_0=nLl`=3vE9b zUWKa)Qr8saxYd;S;Of;lw&(V?CpT87w%0yyZGJsJ`f{>I`8q@XHZy*-IdHs*u!y9#+LBRP z=gMsT;$$|nE#%`X&$oGm1psQ#@p?`OM@N|c|`>l3<kuum5JmBBJ(Xf-X$x>DI>};oj3xBw#TFZ+r$9GzM=Eo7RpbMzu`Vs zkv^7@k1Zm6F#JtJy^#NA814~LRY+Q&p1n9-_;s{&elW4WQNij+uPy6coI?Cv3ANcd zJJu#CK=ZMKwx5fVi;Wb{aT{aIe;HeI^!SLG8VKoY;}3U5UXoW+nIG7ls)8We8DwO* zUs>}Db*%mmJ+$HF)sfkS;i(z8w0@zG5&t6qf4F(ia0>wHzq_$J${8JEk8Q4R zLE(vu0n|PxC?iKb%E{@$(FwABj!w=H3WN_q8Eo$z?j52U`1|qsFB~8zI~VhVt6gvD zRS7kv;T0be>l(5;J|wqPL^YR1wS9>0YRh1gb4L1}PeK2~&iO=19qvs+5DkErky7t! z2PxkikGC*w4Hk}JPbNlXBA8P)HK~u9+D}em;lbF%)MaP(H-)r^YQ*Q=dr8k^0y!aP zQmNStb^(W7(AW2@Z~PUK@O#2E{L6jcekwr^%P=(^FcA`%fq{<`Ic!fs8WEf?0@?5| zvIlYE07@d5g>23M0{L?W>Vq1}JU(=Ub~7LZO6g-D+aZyd%$)RreyI0xC=iGc2XEL= zgr;#g>HYob0|Q_R;+Vs!eM4!SHvi^CjrdUcuq@N;_J|HPVuBLrlvp|oa-akT=09F> zaMbuz=h_tZr9<<{VWcydsdRP<3oI}rh04yL(ldGr9nyo8AI2F31*<=f)D0-K&u9v) z>)Q zy>hVpkFv8yiPxv2jC5lDlVZuFL`rW$cUN*pLt=xwx!3PkZeHW&y~@pfjhCBCRPeeW z5dj3v4+1=K5x6ve-GrL)H=b+65rF+)i0cZnZV>e#jO=K_?z4ywZZW0thOh0!)}sQCLV@Ld8MPEX3Y6(akW_ z!6L!kD)pgLcEHoN60iW89#*#D9!2eyQ)esRE_QsMMma}#r@YEaf05C_>6t%Vp-c_L z6eWi|OF-s>yrrg$nTCkA9FQN>K8ouQ5pc4m>hS-f5e(HZV#IZTxB>|4ODjFlw@dQ& zE(l9%DKL(>FXw2W_RuV{Auo;bRzK2_+f+WJGg9M z7Xj@25D5LHAj_>zL_>r8<-+ZEqmpbmf8C!ayX7Z3XUDnX z$%6PZiU@p8gzP^U5+I`aD?Z>(w7*TH@9nV1){(^WkH<93+dSL{E@1r-x5WBV`sU2& z-rCUm!p!03()sb&!FpOlc`>D}V{W{#x5gts!79dA&(B5mp}nGmjm$kO85{w&rV94A zrL4_}Tbrh`h>5PanZAUno|usix0)g!tQm^(JW2|;H6{ zM*|;c9Zv@x_xnZgZi?W$OuAWGsZr#10${!L@P?Jm z0chVG()!M=x-p=Y98F^+vgk=nP^+9&4kx9rKb^w@5sc4(vHkl906>(?;iUC(lGvOC z#&G7qKqBjdb6K2fOss0$t9!5dptQkH5es-9f+7|Xml9#u*gR8KekE~0kd35dLS1lp$>wMmQaDLJF zsI15;JwWEsN3V+BSW;J5Z%;Ut6u}^cGkYWGq!`$WiKZChmw;d*gw$Q8(lIkI|7pE3 zWKsf-fS!)Hw$|j+!PSFB`kP_>*gOkH<8{6KKBy;;X}L|#6JY> zi`fp49}F)RUF`otFoFT_$F~tz02~3Z0N{Hd{`rmTDu@6+NoY!WvH9a5;1c2E7U2g3 z#D^egNg-ZoxPXPZr1?eEB>7auc(uhA%20tST5HQ&LohEZX{&DRf3ISqwRvq&^YI-y2YrKJbPc;H zxtj~yDC>Gzn0wpXg?bwY+*frlQnJw!)s_>~l;Ok8MNynj0V$w}fD`7C6G!+b(UJ!K z7mn#m{}*u=5EW2zx`&`(c_%CJ+l1_g5dZ6I3K?h$>8WGk$NVQ^A2guzQMjcpe^VVR zy}~sm87%xal;r-DlOSM!C3!*AyI`3F|4Z!riU5KLFBmp|4FdV+Qd7neAgHIquY)s1 zOBmok!vBr*A^sOPH^Tf^xND_!ANikFYA$x_F83e-)%SJA>RUu@n7cSyy*Qmc+FQLi zgTr^}^lthL_=kp8I-!u=w+owKCs1H_q7n%HCTo?rhF(tE-(FYMdWwTp0a0 zHT-&j5?=Eb@P2UZYs~+^N{Bz75zBvhK@b54K>|d0!3ZG`yP|@*VLAG)RpP!ABTfGORb-W=6)UHH&Zptte@zgy4bJzOn1nR z!sf63$U)iTzOvh0S$i9~dzO+m#$uL+k~Sv7CTLsGL#8*7J$^m4>q^o*;BM5FL}1ni zG^eO=MOx|~;*vr(_Nu|LVqPKQzA_$R&f{xtQP&^F@cU<|rM+{l zrM_BNuiw}YtZq_!{6xq5q241m9dBpDC$0d3biM3N9=V$MxTv_Nl3x_8itid<6O{?2G1m}z97C3oP)pZ%szqgLzKiSV5URhixK8q5^ z%h(5)zL4s$e{hI)tmCs&B>WuWE^z$)VDD^y_w-=v{BZZj!S>IMrNhr-OGC6z!_=vn z;l-t?&AqkL!=3L3yJvXzc1{m=&JH%u_m_XH4(;}TnEDXWTI}%dtw&XFBBec|tHiam z*tK-5R@iBxpi0uVJLdMRVz@#QZrr3vwvz|C=XC#T9gyVowc>iU% zWJ96ay~Bru25IgDsh@$I}g<>*wMl#f2uU}oXZqQ=l@fZQ>7 zqk2L3*8A6HnddN)DNqX0)9`cA@kw?XiX;j% z^vL0sm5=CyXST7`J})X1|Inglu(f}6qM)_xaaK5OWgJSjZx?%69}4qoUsJz~Y+syl)+gNJ{8jJigXC4T z)+M%mV^y?3%A^0?P(?~#MFK^@Fol_@5pp0yWmyY#MH^V9WVp4(MNAa$CVIQ(g(6cT zu|7}B=Z@@sBT;L0VPvj^xUpwH&FybT7AH&I){wW+M6HaV28_TG+;Sq9=3haiJs|({ z8j}A}`zR>{*yrB@H~-Cl^LJtHe}m$-vlhK=Ok_UWnMvB3g83EHQy0|J5CqgiWO%~x z1qcZ1J%Ang>&h}$s1K>>>)_Sx8w(Epel5iVd0V_91?4p^x=-qFMw>1wa-?x^Kq2atrmKD%-8^YhNe z(8||^lFPKOb%PZ!ES?j{@^A8=^j^wSO4n)PEl7T$=7! z{nEKU)44iZGE9$YtN^MX{1H~K7g+c)`Jv48FU$8YFN6``$-8_45hBh4eDx(E1g&`) z-BJR>3%*^G`nP8T}g-;OZeut=TLlM}$B4tA!_ z4*Czb>!ybj8{db2EP3)a56b^b=WjARUqs=17L@-O{vpV7wn+>C1Vj`*#yt5u^BHdl z{eKk9Up_E@A^a05(E5Sy#*sdS%+~5LX8lxu@5W4NUsv<|Slj$)ZfEVY?ncJW!n<*j zLr#>k*L`h&7Zopi1s5BMyXNu^x25lxOWrn>wnaU}Z6Q+waVrx6eN6#9bs+-{VSRNW zT@8M9B>@eU>vA$zB*p(1FW*0<6;-?fVW_u(J;j;d zoZCNHI|u9hegEg_-jCz`v;B?Zt#A9A-wrnB_g6pf?=GC}O`qM1RaGMK}rXVI9sEH+X!vzVM`fbrQ?-Y*}?d2}YUP8NS+pne6z zKYfUqIn2l$B#@t+Aqq^mFzROEl|y~XK`b*RtB;h%AVXXV1%7%TR{fr+-Uk1+2EUfh zh#qPz6=R>B%4Q@mS(y1CY6&8MFbFV+w1+-;g!|L`hcfyZv9!J<#!yCIPe@C)ej1K| ze9PRP$SzhqgAvD|$1~_)fl=L(K>PTlCeJ#bmPlb|WB+H;Qs~T72#R1F25m!SWl;OF z=}p1!qxD1E!aicxVI;Np1T~dCcpj@3>>>OhRMo5aPI94bO0=q9xRQT^?*}vjv<7u` z29tXu>Am65f})Uv1{jTzfmG@t^w+S`hLK7ER|PW@3=6#{y0{j4+Qhir@vX|MN)m3xfrg z6W~`B)^sw`@wBuKa*8TVz7y-N>vP*R(?5?|7Fm&cH~OJnw5N`zjfRt@>xr1F3Yp8w*lCuMs-a5V{q@5yFG|D3 zROud3E-a)aBdjAQsEQVNQOG{IWkk@PfFc;Yzk&HL&i|Vr7v}$OLYV(NsveFqc9t^t zEamL2L@g2fqXoc6Kt~<;4>8*{;M+p-13>}c2q2Ij4d{7P_<-j?`KhjqS3Y%>TQK}8 z%3gy1mv%7Nfzb${qJV<{&)@n_06{#E0O@JN_9bd$a5?{tMNRa@&5Y!T0cEA)bXUXm zo{k#;ga@ilw|!rw)4qOLIX_`6&cE-cecoA{-`iQ(-x*$5K<P)Kv<4eczqeIENT z!frvU-lzWe6Kv+;8gqZOY=r)1oK^RAtZsg+WQdkcYexB0a19*3FT-kHV&@O8dL9Tm z7{mYVGoUo^f`J#t{0A$wBwx+)EBA`oo)q=JL?$;zzGD+zS#B`+&_Ko?pa1 z*r$ctrG(r`3AQB)Ux>oT+nD*$z8L#|zghtNhw>l%FT(%By$wS=bwfOJsErwIRSyf& z)7z_4J1V0;mSiJ#{bgo&WpUXcDXXW-K0CrN+*956fvn4I*#{QV_bnA2tYz_+y4< zS}h`1Kchq+>{ zw^sW0);N0`oW0Gyy>;5=YR~#QX=|l@Wxi&XkxovujCYiD4$uhv5K;*wpOedA=CK%0 z5u`we50{d}A|)`9b>ALI>W(3^pK|I0>jKn5s{N`*^ZNVnZRu1>I-QZl;N{@Y@*3gbRNNz$pXo++nKP-^HK!j4T`LpO4{xFCU^PjjB;H!NgDUz71M8;qS zhmlDB;8GqV7Y;>exm!6smP(3*IhRU{!y6JUo?7iwRbX34O(FwyV!{GIIKK!Y7#1*g zI+LD8>(6CV(@80o@db8IyQ5n=LK}O-+sM(qZGnvi*08F2#A*ANy5#1VC*+x?)I6$e z@Nb1vxGk7OZ2qB)-cWi^IE@G+BIZB9pCNYY5Ib!Uy*8|@0V=SyC{j;!59WV+RC`xq z*Qyb$&f%Ad=$e;fhCrGUVB zUbQHx6u432^Rn^0)ij{ z1Z0H-?53gvV$EG9vS-B>Uvu$I_o-R`Q`SM2A5fc_Nb`L_VK z_G5Rs`&MFBh7z}p5ct5SkB9(GA;<;w)p@}JYlFR2;YE!jM!E(jxw3#Rwnt4KOm$-O zhp-2)@;4M^p(nqEflpitpc++&?DK{)2m(U+gS!Bi8iD@<3&Q>{3h>8JU&I*sKcE1J z2nZQ#Gr7B#3J*#Cbc;tXmlWFf$AV<})-fa=Hr#dU6?U>D{#{y&vN{s>15P z^A?2y+X2t}{&^5EpRxiR0mOBnq6l07VE=&kL`EF6Kta_n!|F=H8{Q^#RTqzvUyRZ- z=`A?}J;k4))T8G1k&p%Ve1Kdw&Sq{d&z&4iZf(z=9kSQHy=3&JqcWzUEEGgT=~HO_ zG5_7*{JNC=J0kNfE&OlHpU8YpBIZA2KgfI_=0EW~HV=Pk4)GO~0 z{fG=P&k!N^AZgz?tgS>0P-+}T*(-}tt-F?+B- zbG$mVH{ZLu#M&Njo_ib7fEI`T`iZ^i!=Jl9&-Z_P-#`Dp|NV6L>~Q<&VB_Rq<7jX3 zaCi22ed1uLe{Z&XW1(wnwr%Zm%hKqFFOzjM-^eQ)oXrjP`Z{xco3(v7bZ|6yu+Q4< zf5}OIV}BJ5X#ozY}!3Ih(T44aH3^E6Ht zoeA(HjmF4eKud{e1y&ji6@ATNwQds5u!W45d_rU#qBuEE$3ccNvXI6O zD6nD?cL5G1vyYa^!4W`BXVVFXFXTOh1%RGN>yGGY4sLG?>7>L`fdv7>$LRnT7%TvR z3nlekqC>=`00b^8p2dR5Czi}fXLbj-S192r=~#ZgoA(qI)Ii;Wu()=XngQ}8*doX7+BL0-qIA@)Z*9B6W-Pv z(fZE5AWkhP+cLJ&qxh|3aivFj)x(tu$0^k?8hD1Ql6F_ti z|5ZNjKY20dq37oX7DVK~5jp>t2f?MPlVE-^@Cg+tpdrHN^*hhCKl!d*5x4=^=b9jt zpIkS^c#s8sQN>*!zIDTEzTz>Dou1-tEomcVNd1BQVC|RCRut7j5HwuC#D_3&Ar4yHKuJJbT2NaWT>#1shT_&5 za`yT%h=abXt>R*$?qjVJVCVHb`h8#f#Kz*_@@#g?OS?p06?itDlYec4~tpp!y-!9z7YFtstbq!6fg*1 zZY@N*0m)Io1I!=$KjuFlvHvSykrBJD2qHipDj*&t|3K%7AP5yjya#1K5CNCeFy=px zx+;= zuI%S$tEVR$-%pkg_UKb%vzu#pzw`6w>d&*`)s>?rv_=9nEzP&gDMJx-xmf0?S}-kybvrv5W+vpi0c6M ze=xscXoNv1Q0;5qiu{a0SL2L#bBOqb#iuii)AbTkae7;RUsuEI=-A=*#Qs+A z)Tg2K)ye%G_Qq=c%t#KUDeQeQI)6P1QxW@s+DA9Uem;$H%8GJGBgCJm`n{U~+0Ui& zhlqXfh2|5FC7fU3SpK~re>UldD`Z!vJdK&pTTZVd> z2D^FY#iuoWs2v@sW-uXC+X3^tvQbsr+0E?V+CM!1b%9VfIDFC1b#n4!a%`T%7{cHA zSUg}^SOOxp?!V4YVPHen&*BW#+&EQ zKqhaW|JeJE;eWb!db)FlSLlRJk1k&~&kh&PHb#$^sC(1(==q)d^nUL1$2n?oe`8`N zr*vqAy1s!h@$PTSy{l`~jdkYM-q_L6*vTeshnm(ED(mAc>X3UcqbIpz6gfXn2YTa3 zJqZ+8R=Z+)dtxc1cnT}4uQj3}P|d$JtN{=ZMkV4j>1hnGx0D2Ge>QXA8N1l|nS-c( zO?b^z>GWX!I4!;pC0Vr0A!^0|39+0Q{>Z@0=p$vYN$J@9!6x^?Q$R`~ARuxQ#FJoY z`v{UZjSaY_Bdn`Ew7VyY3;_=z0m2cGa=G>=VeAtRvHz#_^(C<(2gQ=lOrbFoskI)J z3Ca;k>ajJRRg8F~H208WD81pm(CQc7E39xY1J}TWmjS-x6vBE;CpLd3PB8{PlSJ;% zVUbgMl1$=C9A0)swYG<~Hu=@H`ZsllAQYnhrCnaMivNqd>6LCTOPoq7y{qf}nh^v_ ziemMI(nw+S-ViF{ATDF5hlu?@4Of5xW;#?%0}NP^5yj*;Od>Hp%6O<7amJ=0{ zMI*4NBz(0hlEUhef_hR4ceEtTlj(=$QH0JxKJj z2y^l(jE?@8>s=h}l^52vJkmDLN&c9x=4>cyqakUmf(igdb1ivO4M`m(jBBC-QdbFB z5H12@+KQkCM06F!O_U8hZtJ>PN?M>}R|+BjMt=8k?@)3wly@?ab7G1ma{BcLJ$BY-fn;FP5VRb+VN#Qs9|5ehT`mtp@${V}W)#6^Hx z-Q$6*9qODcG5iAD_Yg z5Bvu_FPEAE=wKWH*#EKltanH??}qi54v;PA?zH0ROV^VnTE?2ar(E2KLGgS{EREQzfi z=C2}u0_`cl{Kpj_1iUb=1C_;rNhld7$cc zN68U>Iy|-j)&K#?+<~&!98jAOA~+1;!o#B_j6^;SWkGEl&*$RL?G~h#{xX#Hsbur0=k&(_3Ia|}=T5)R?VrsZp3WYgeff1! zIlg2QpJe3gW&Fh5_>uGNAWsutC*uHT>3fD6kM2j57gw;EEkh%%Bcs&MUrMW5ib`s_ znFH%P2j@SCd>YQ&|SRt>ilGc{mmzTR% zm&vPZ^tGLV-966E=kkdR%jA3f_JLY~jZw9u&jx5|jPAtVuGpTgSTcZ@R;=QQAWX?g zMsc~;nf)0wsAwqhWRR!qbWCPk0q8?{ee5i1l6j1am}5(9%cs|q{ZEH!DTA;Un-DDl+_P8*%kn}#PG}9*Z z0VrCuz5g8nffP{mKSBZ|V+bLTikPN?gq|{VL74x-+VT=6$~IxH_HmCC?9r2@V(f4K zC^y>Z@m(cHU0q)*Z9f}bUu%=#`<}Uxg)J2?dMX{09t#@Ei5e>kYsrad$_uE;@G3~$ zgriLwDbOM}u>TYI587>z0?K>Y1qS~wkFxU}1&7-b)&|0+y2$*8L=YlR1jPvGt3&N` zRY@Az{$PGF?Ew^E_(R)I;6e!bfq?Mx6(%nzfAC=b<3vCf97I7xBQU^!f&zdY0N4>a z;)(rVSYH>DU(6W8pCEtb?pR7%8lwUL^Iy&BE|z~C4@Xs}J9-c8tNMCSrn3T{FS4Bh z`u;dS{{Cxo?{MYt5RCB1)>{A83g=*rNOK~Vi7t_AYI zvhcI;5;|u36G^Kge);An-_w3~O?#9B|A#4Z(o6GM247AszcGZPd zzkFPp?OmMimJ8*7oJ&@;TXw8-7R3MI_Q@gl3ENlD-NeAV@d1E<(D?}4mqnO29PWt6vmu&Y~MY{$ab=)nqk>GQzO;>`D*Z@-QwPBxOOOVb+OJ*PB>SLWYO z3x!!&_mP8!=Y2eCZugWNZIm9^LRAI)N7URv#N3cyU+adt0xEl;>=iN87SdMd0bYj^ zA7peO%1@490sfMb{qNj-|EZv16`O08UL@)h{pWqJ8}0#?Z$9SCY;>Od96J9wb#}IR ze!g^i_U-ii)AsR~^B;W&zcRb&hCzWQI0C$!_2A$jGD2+)16^Qbe%{+WdvSuDp8a+1 zS^3AH@Qm`B_K~T1%>P}`vWKT@8@tnAmIjBW7_8y>c_ev*2>yxY-tEo9^~K%A$+fQ| z>l>eUH>VF*Cyr+rdy^d-i=_SO+NBq+?+QIjMr)_eW=?-@o}X`?A8nl-ZJ(ZQq4(wd zeE3)ktAw7T)?a{*B4#h4 zlM6F*s3)G?i>mZ=++aBR6rmCF5w^s0Rb`Su{35Jwbr#fNjWT8HKy6O z9xHu&Xa_BhhE$(4tBkhLmZ4`u)MPqn4n)AgbPON}o-7))Kxv?Z@#D~u2-*@{8>bWb z@o{-;SW{z2V{=d=P@vYw^_{_uHC}HMw8FxbgWfs3{NPnn;a1%d+>QJPau}T)Oz#aQ z^&$~23H`-rAL}Qypy`1KhHIuTUWSmTt^WM4h5vcK^G**`v>>6f8V+ac@G|d|5*F~071Zi z?N9#e*#B_~!0>gI{|1*BG3|+40B|9pTet$;66OXSK!}1wdHEy-`6Q7zEhwxYCM+)| ztSo*@PC&sz**ehPE7RZ9$J)ThDy=a;wXVpoFy;fNy|lN=EBbNANDqB(Fuo|Mb&Nt^ z8mSrVihuv?QBJr+(i6LIPhBr`o#?9A>Vf2yGf|fT|7)NkLsS4OOXv_NkhrcAqCsH< z00oQ`AU${M(9(3<2zOC4Wy??(T`yZPD^=-xT24>>qMM%?1lsW#%Zu7*C6vAF+gK%hswZIXB z<)4@g(EmUsh`8XJs`5bo1>pbHQoRn%r;;4u3xgaKC&J~Z$1MOVpj*m7eq`|td`Nyk zBQUrCC0WQsFK+}2HO;lr(hGG~(WYMc(z_9Z;I-Sy%1nBjMlN2M|yoEC3(^DvLs@UPRTFMAet(uv)Vjt!ce=>68X^0Tc~WUqQZ2X?{ISsvKwb zEPn1={mNRHfhBGFaHn@+BDS(5v$LkCuM4M%XAv?Vl0Ea2P+^Jr@0=Oslpf)b5@w$i zau35FntuZPe}cA0D1QL{SYhUecv*ycTSfR-MfsS8J~RvS(DJqSD}6d}xYED7@{-!o zF*`WC^X<#ey_zACZ(-Wo{+{mbFEJlqTF3cm`8eqNIis9K&D~DP5na6&(zd1&7KRFT zw?V8(+gcz6NZ1(WJ4mqb``3eN7k^w4eKl@e^c19dad0ci{~;m%Pf@Y|%FWMbW@q=b zR6YLbRmaDF-1iXli*~Iim3-Twoc`!PJ)Jx|oBjTM{`C8&gVTwV?<3!T)-7&&zbw)8 zbk}mUH+tx9;OS!M>*V()%^@}HIk_1XNGlgV7_+mD6h>2TUk_t+U}T!k8YfYQD6CO3 zbAU5AF+MdnH^01paPspPY+yh3wvUh)y7YN#ab#n8YKpK9AE zaC?`1H*ct74mNi=B%R*T2%V__b+asb_h)XK9K2 zZI!mN)UmM9xxCmso9~=$$z$WH=-nCHHUu>=ns8Bf8x4IUttGe}3v*jgy`Q3Yh5Os# zY*?!heMts++Mn46Pc8x$7^&3Z9A;;9L!jytFFCKq$mU@L!95+Jr3~OfISZOuP=-Q> z7!npO1ohy-@}GS9dikF4`GW9GhR?T;nZg3d)0fgmO$3ZX>WQHcNe+ZHjMJBl`F}|S zBPI?H2;z7aBc9b8+Di)S?h0(q)k}&|2z~qDH9dvW7TN|*q1LA|-!7jLPs08WDG?4D zh(C$YiFD!!KtTWv(V*$biy$-7DYTUCr^d+zHc#8J{3E9{sG&8m3Axj){tfLx^>3Y? zN2mnlm}J$tSAFoPZuM)YM>8oQG-?Qq6hiKeqLQIj%@|++^GO?E;|h>IKucr+-J-@( zJA#S*zlHd3*0m%y`dB;?rurRNHfB@Rz1qFEc__+9a_{D^|1^I9C zz$hTVCCtw)B5(`EzCye=aWCMzd6nnJpIp}w^>ZDTF@alu@LY%T2bm9-T2MHGZ{Q8L zxB$0=Ah!tL4I&YOn*jf1L~siL_|GdP1PRbBNxmCWy!vkDL4`5Vm6?9I5qD$U{a(f^ zIT*O522j5CcTBQcm|fEw^Ix{U&aBU`oNTaWhqK<~m-c+fX?pRFQCHCN&cx47=C-yN zL_Q`OGREo<{EO=-$r`C*{$uzHsmqG#C`lWrpa?+HL`~(cp_Y?{ri&T8y;9cNQdSxg zw>6cVjOFb09=}e^?tAa>^a;P2w1gGh2f1H<9z1WYlC{%Tx^F0~jTC4U!OIG3$`R%- zIWhRZxM2Z97M!>Mh=40-J-Dn+#{Ms1ZG!nPb;ktA4?MpRhd}v>2eJ?V`@*{F0;q0R z$1s<<0of-eKVTn(KfvUrEOQC?$X{2GzNR39QvmZHrZAicpnY*!_?sF4{*U)?0V7bF z5dXvcYp5%N$4F1y#1PD{q?NI(jj61Sxw`XRRp&d}ZuSO`Ty)*Kbkq- zVJ>`u#BclbZ1?nR@B8`A#ZM$W*Nt#0hnZ;jsu;%=ptp$Aoy}+|8X%R7&`XA??>_at z8E3Sw&o_Si^a`C4-F2bWCBa~L%L^Wt=3x2%zYm5#aSJF8!P;M5gyA1v{TjnRf##@G5k8i<0$~0JyX!o5NNspCc(hzdZpmnVUp+!aXIAY5`z5V0q9VV1 zl>Bj~FYs-Saj2)RpR-CJjb&q@U_O}%rtU;+O-n%Vl2Md@f3Z20MDB4>CbCa+# zLb#te#8<|8_!A53Y6xlLQNthcij>q1C8d7|3I7)!QI*FL<~grL1LLl``u*kVFBYEW z)yjIYwD)1_r1SXaz^`AE7e6O{o)4X!jh>$mUtHv}#>}FU3SO=S=-Ln|KCFDMTKZDCG+VX$ zsdRq2Y+=4;dHluXd(X01jp%n?Z$H18{93cH+OfRcy}UwRT_G*6Q8(x7<~F+4=4xlt z?xgBnHw!b0Vk1i@mDwHH(-Gd&9@^CkK~6lK65XAkACX`XKavCa4ULvaBT^Iy7cJ0u z?B_sWD1+I|b}$8sj~~i-)`vDuJfA?D7&U?2gQ`TLEghJDKR911)IKRJfIqm`|Eb9o{1lu_dbwk9f>vase@%066J~XDP*X=xOY@Uj1VlIcS7)0i$ErtE*q1hW z)z*8~Qp2g#Fgi7uP70;;Mp4j2Ky*-|fIfYIs3*=Cf?x^%A_bNT;Q!$r=n?1$Yif&a z_BZtvCglEtg1lJJ`Tl|y=-RDoNQJo0b>rGi9&S*=+}u1onE$u<`FMo{`Nc%Ih52s^ z@Ica!`F{=iAFjWyp!}Wh#&0*T{&wrHf8G4!5156yt`gS)^a5buOA2yJ;MCyd#_})7 z%`1V)C_oSak{FfTP=N|5i~l9bFQ_N0?`56c{wk-bSkb{q#7gO5UPOA+i^sWtByncYYpkpY1R0Z!YX^%pb26bySp+n!4u)T$267j8sJQQ2whWXGUZ-Nb0Ic zYJ&n+lGay|)>p;w$IuqimJu^l1d^}qWG-r=Bx|do?P(!qrl{>S;!~XwoUM_?~g7Za6uz&&K_7yaMOBVrdO8i zDQt{4m1O>smA-|LXJt8Fgg>Y%5Z|l{38*abZ7ReOKzs=t0b+-VreI?Jiy8s{*Aq5E z$FY%=m9g|~6GadZcTgH@tLk8*>;Ayxi3h^uz4Kz5#s)qeZVjw`<1Ej8-d$Tf+TT1o zMRf>zLuSuU+Gi)rhM8}M>G`y-LUvaHyBk$3)pLknAZJrr(9BypLT_D}LG55-OI2{y z3*h;|(DoD4o_KRQYa+xPj~-o9wD+x1r9BA5At~M=yK`Cap&0&_QfyG&tD(~ z#!zy)dmdZers?)b+R_4c1MmFQw6?OqmrpDEX*1tXDoON8GPR>`q`QBlv75$Z4b6P{ zx`EUNbo9aid;t~c&mR{*&VHUBot4+b72xCnp;xN8e5WHf{GGtdX|AwXQGJFU{3_Tc}!` zullx7v4m%)0<~@5@O&y;oGe?MdiQnw)y$_i^K%u8j6`adaeA6zN?Ul#M8WW4^~`eX z;`>L`Pap(g}wKD+Y#2%5LAyV z0D%JG38-%ktgmz_NzjbUH_2*wSX1v=M+qU*Lg=(mPym3-D5OLNJp=i5L>UNUo{}JH%m(Z>M;N$+M;LZQ! zyZJA^EC0Cl$3JfT>mOJC&;S1I`ZcawC=27_y2ZzH_14Ybu3!0s>)I9cJfajvkWhsF ziGzUu1~LE91(duRomsh@Tt(q?Z0RmD3`3pG^RG@@_$52tqR83e{PQ*Z7 zL|^W<-vf{2C+2<+^t^2}TrsZYrR{X3Y&5)|MK51mP}j!nf}Iu2b@lFBX*-yT=qn&u z09u^8a@zV8sNW{6u>WS^)mVdrQjN1e$PZ8)G=X(DU;D zCp_>0>VfA=RpFYVB(NQbKe?d-Qi0A>>ZS^${s8uIA}A2JF;qax^4ws4p#=i+Phdfy zjOCyLB2=Sz5EBG080Ie>4PiqaG=E|L7dFrqGtrl@1R-vQ`LA>jW;P4e2Z#>7Z|LQu z>SXEtJpSVtXKa6y@pW$MU~3+|QR~aVSkNIdcXBv(vP;=mY+jfu>8BR=QC<#HDy9cJ zHWxZK7ZB8$(pK}dy9u_ViZMs;(rs@_FF9XHaH_BKhszvw*jGL1hJj zWd#9HfxgN2f1B@zPgWG-j)2C2n8r5|^(CoY9||~~5ES8NQ98vc93YiVu$mUfdsk=3 zU#CYlSH7Me%^x3(tt}0$FMs)dKwq3~Li=}58<=IU!c_0)sSv;;^V$7roKt!vmj4ID z{13aA6mpksIytal_tO_rY2J+4=D4uimelt{DZY zF79%6cLGZb>tPWsO-hB1$7ODP4#U9g9D#u)^>JIew=+rmfHnPUr>JjE&n8z z|D&_B_0@yK1691Ozwn?PYE z(An{feqtxbl%^ALI&q}FWXeD$ttqg^PwtVMlw0YeH=G=HU+!RU60J3~8{-|$g5G#0 z?gH5PFNpwL1b_lzNFut2nE%8`C+0J50f^{CQ5WF?K!!6Ep@4dbHJN?#?HTPj!<5Bm$})zF|G3Hw1i0F-z}??BqNhV5brDpU{-z4e*~7 z1{D{XG(1oQ(HJQ>)F^{+2gG(~7{umSX0(RXw}dq}1vfSXHlmEaEs(efwD^6@H_u8? zi~8tV)&awsUneD)Mh^x4Pwouu#X*Ml$;$$Il-Km*)Wgq0%>S5PlnZx;B2BcR^+`iV zWK)!RxVE64sg#A2rqd$>?+_!u2#eroi_mE6@F<&z5UZfaM&6DZ4@_iCUo`d6eyKB(01@Otranl!5vGE&BuofX)B9B1SzTJ>ln-NB$3&24+4o z-=OdzZUHcYVYUM?;8K>yD+Gi%3jqG$IKX*`xa^r);g~D^ub^{-!7&#d^+8k|9&#Kw%oV$bz*OezBEhu zHZygy*E>I5J308A(NheSTz7pwtGnz|Kf?K0C%dTSs(~GNb`)(~?*f?f?ixaS;fwc@gpPbw+n> z7Nsfl!z+~k<}h0GnVl_5lM@$*)4z_%bD!!4n1d@{Ig4{+n=8nm8#~x)`81r{*$`Rz z+UI4K_ltD*XNexq5}ZN)X2o4j{!jw^Nen^YGc^A;vDo~5h|ISLADc`3=XNLo`(XH+ zhj^L=KSUy&Mf4;8m#ObYdiwSk>Dvosqx8<@Nz&T%;IH+8@9X{FH=k469;Am`#`)^_ zIcq&}QulRId3ayZ^{#@Gt&;Oy41bvWr0<$b*_zAUw-z9xi+J*M@&Hmx-8A#wBO z0qe=Dr7u4oOf3i2))@x}hgB8zFO4^H=_4B}g6;JtCX=x=w{v*(5j+0RzoY(%--bO<0p(q+0Hp;CoRkFmIyMqti;g~+yWBNhehS3aJb1M zk@^v(js>$76BD@-X{u-l>04hOlCr*J3>2c=67?B7^AEHK3 zs9{6YQ1S?AsN20cMK7_;s(=+n2mT|75(59{MDf^hd?IudjRS&(9`FBf0RsiPfY@PUL(G4G4@x&-LA{}BYk~Q%nra4W{xwKKxbm8qWfd1UXj z&PxZj7dZ#pLt6`V!$;`RRI(Jpsmk+-qD^73%! z^ZTj2N0KMo{WD_b&I+mulKY9fLr`OZS9u0e_*;PapW>7m<#N3IJ7*H}pOAfm|2;1J z0{DaZPbB}x0rLsClMr$<+Seu~5G*jl-?E09r#?QJ{;*#!WyW?^x6biae!kuK`H}K) zv3p5cBVdNq=K=pW@OQoD=dADVa>W}tQMWZ+?X>SZVEW%*FK1-`=XFzq)MC@JCY6Nz z)Bf@Qat!<9e$2(-9F@3I<-}5j#Nx|&b*gy{PTkDpkx9|(_ltl1=-=A$tE~#JuOhF^ z_fJU4vy=T3;toD<451;b0Ez7g$S$bP`~|Md&_{jXop*!cA6>qjexo6`pm zr;Z-YynHDjZt-@M*`_k8E=i>>$1 zX5Jp4Bdu?Dx_p_Ph=rDgFt@?D;r@79cl1DOSWh=;P?#@WXk5eapQ%N>+v;rX>Ri?8 zLiOfc<=Ra7;#%wGRLLBQtCDo%rwRnK`4VB`=xpBjI*|PB&VCjjx@l-L605K+W zhDe$%9fyi0gU3&1i&EKRd0ckFaHetMol|#W4Psas%(=?BnUYyvx^Og6z(q1oiU^5w zoHP-l=U@Q4xK0FKcW20z==ahK>z*_rwQ%_;#8?H zNyv#B;Y83H>?$IZLR#EvILX6>)_If&@+7QkaI_K3FU}OaAylA5Cs($Rmm}ck2n5*z zQKoPVe~UE!bheNd+!3teS?O3ziyov$4N=0$r~spfQOSX1Xn~kvgQb?a$+|IkFOC;- z!#LtN2`7@zj^QEd2lHQ)50@E?5=1K*{zO#O^NIbR0sLn;Y={;-)a%>P;MLGa>K;j9 zz!3)N5h`hLFbPrwA~eNhi8xt8L4j0IC>52C^9seB5-}x%)<|kha*4OSVuvyJkN*HB zbXHd3;ss>|u)}BMWzV2EUiQ=}SO#DOmV!F zC?F&5EK0!;p09jP!BE8|*3&0D%qiW+B|pR=(?`S0#G^P|!^O}b;HGniw@*=I&mya9 zic&P(*gePM?#|4AcvwuSNp8){?XL3AjkxAys%>kaZcRk}VAWSQzouykEC|TIE+jz8 zL>;8IlBpKD08}ilC|h1pv(<4-@XROId1Qoo7e%8ESmmyvrlYY{#9d=A+mM3f$)_8K zKfi9jecCoU;Flh57vTZn=p|EaIRmu7qXJU?6o_mM#j~19Cy4$RumJMEqxeSQ{O?L~ zzbRb=19-{O1hBuH*)@c`DG;=v2_hiQqw`&lKzOjs<2jz>z<-eQpaKZ!47_0YS)fB& zs-T96{$JfIr-=DaTmges>JaDrO;KvCUD*Wu|h=t8(xt=fJg0?g@*l2&D+GI z>w4>&`)$(zH_H%r15XEIKc|5OAsD>nR|kvlp09p-GkLJj+1cdnZ*%syNA|WT`% zshJYAuT0cVa*?`UE*dH3P)m4}p@%DLKR#kxtd_75{y*?=zIjfZKHN!wKMyLRyQ;DC zlOB{uLJQPh9^OJc5p5Ni{1L6?I2yuR%0LR>7lgHx;!C2tYvTIr3xyQw-fH*i1gxw* zs}p@o4Qz(^O8Cty;ejY-kPr$(F5x;&7-^w{GE*h?_Cdc1qFQ7^Dg+`EA9@k z0DuC(Edccjny$B%>@2|rE8ViVY-@?mHS}-d76xht7c@Djv+y7hPFF`pTN_8fAIfU~ z&-n}g$AwF0@3@=fRbMNpR*cCz7nFL|D_+(oMJv8cEvZ~7xmYQuN+rKut)NybqcWQ} z4I*IX{pYsnr2;CoYf?&^ou*As(B~$%4iAC$pw)%Qd?5ZK68?{eKau>8pdT2vF#NaH z2-s(H;_%V*i^o&1b|zkKNRMXePqui6o7@+ziR5t0L~;A%mq(xB19|uC!;76)M?0?% zw%#5szJ1Dn`IK=qTfWRm6b*(94}}dg5=I%xBa9>lHJ&mU)88D>+UVOVDIQyI*;r_R z19xGrVri~yWxirhAdC=mw=@CPCvDWD$WpurI!!4Gi-AhLik_R|pZ zKQ2w5;3o)S^<|M5+(<@?Lrt)pU#(+lhgWTlVVByCV0LNM0IF^6#zev&(BymR~hnXZQBb>qv zqj!0<*E-iyV<QlOO}0lf$y=o~_UV4+nwBZCaxz&rO-0%O}U{mbL7dYT2+#`{!|Jad8y z=rzFqNhR^ZXA2$U1L4)l{VS}=_Zy5Sk`{5laiFb%r;UlHrH+G%o})45zoyM~pgjct zYod)77arx|B{Kix{aQWqsetQi{!R~k%v>glOt|f5mu3I@;18KuBJD` z9iwZrM31MRq3QbP&zC@W051#PEj%^n{k`A8>&YM*w=> zLH;7=K?8w5cus1lfZn}es85^)pa71=KluE2t;>Hx0t&ytRc$zh&mVULoJaTrARt4% zi#M+0l(}qes&0$&UrWu~mf8;1I?hl!-MQfp@sF#a&)r**UaYNI!0DphZOPHD^yul_ z+m{Pp-^_k`HS}<~VMbIlEv%g8K|@hJ#jT$cqgxxuOyXcm7QJ&|V~+dmVaxnj)2y&( zeQx;4ddKoa4!bWF&0kpQQTy0b8s1V8^`L^(MqoZ64Mky1CB)2cJ7$Di%AyE$P&o{| z3B8TT3rZYnZeNy)-tN^;jOLB>v@MFe7bL9B`G?;=?)~`k=+pa$@83QC`f>HcYbIiX zz(H?M#`M&~VvO2H&oYSrlRb+F@)xlW2!BA~`|Z>SbUq^Xhk$^f{EQE_L*{>Mpe>X? zFn>k)fdaOVha5EcR(yb2tat8kJO9OI|FRh5C+Er1@YW2tfNBw)f3UIm=>@C-u@6en z7ik=F&oIE%z~4pR*ZGRKlb(-@p11QAx7%8-w{Z*5bhcNyb5qIQ0zsgc(FJK^u6WB_ z!P4}inIVdPE*M|C1Zu|Q8ma-#>S&(VyLwSi|CF-&pDLRFP4@hMRnk%pi7_m!*3Pb0 zh|0SdnxPt!s}Pu}7N0K@mMou|e=aujRAj1hYDqS4cJuqsC*OaH58pM2##)6U?&|XB z($d<|i?2Un^Ton{JpGB~AHH7#{`n5#_vg0{-@fd>eEV?oXdP);lLs5pgGUoD9!ph$a;iy92h-2L?0rQ8+^ffL_ScV|t-N|V`}(Qq<<`*Ndh;eP zNkj`~4g_Hrr88nihU14Bu{1^;g_$%o1XqSvbz@+|Ox4s@+vZB$`cl=(V#Vr0+3Hfo z%0l_la@ER8-6|`A5uzPh?_9B3J~^HuU<3_KCh=EG=hqsL2)eM+w7lB9GF3UT(XlvI z#=WoX;-!3_64^JJ#HK~jhr)(fkxX$qzuT)NKr>)8ePp(5Mv@|&%9xlU#xG_vhN>8I zm9Pe6i7-e-X3f|ayaW4V-QP?8kA)7;KLOVa1fV|tO=yFrHDnq zg;J#wJj7y8jCu@wfIP_jITrj(5T73}|M(C=pkN1ZDBx#-|Bq)(;0yT)d_HWp;qcSgJW6Z$sGJje7OWij1=Ne94nb(Q5MAisAUoGvmpBvh@k(>6iCu| zQ(1gbBD2&iAy~n^<9;2JG(ZXNCHwVJ0te`ULnA>HRtTBl-=D4%ooAdrmcZwcc$`Q9 zi^OL~@qlhgP+^=mN$meO$=(hp3+rE+Vh`R2|W)H0j-O%uTJm+#LlmI4pE`}dBG`6d;R6y(BTEioQy`W&T>FNtqVdjD#Yid-7Ax{ z-Q~`CG5_%zG>PkPUd=z-pW1s02dp9$h=y^{i*`w_X`#;1#g!1$6`5#~t37l80rCk42=nL7*!lAg%}9zaH$a z>*b{7Vhew_ii4E~6rnD+kq80D2k2lV0^uNl7D&m4px_lOP2>RzK@nu6k1GJ?zns3F zjMf#ID>^4tH2$lM!Y?;&=_KV|EvQ#ZDZ3DwsT`7hEv`zPlqXNhxDcQ5tAC7UUVWBi zasKmP2S5Hg{QhJ0!}q?0tvarlIx{mmyY%eChyT6xquK>UF9hXFyyAa9zJ31w`T3g< z+Yg_wFC45*A8n2wZjL>FH1T?8?A4m!*$iWMn)+yqd(f3R6nQIgs(b3wqt73netNO? z@^Is5cj55K%=2x*i-*I{=36(VIWvPni~+wPY6xXGW|$c_JRDC08#^3BX2cDRCR6B1 z{T260+C$q{s^>Nv)|RT57b}++tCkikmKIAFW(%j6YnCKg+?eap+2(1pMWU%(2{UL& zNMbBxO{`QbELP1g*RL$qBdl05Q#rO!FUh-=Yfk$pZhfhx`sNHBik(oN=bllX#Up(I5jO_Pohzaatm5Cb3dF68}qkNuyJ`lB6y zI26WU1p7M<4j%&iKRy=_^(IUf^5QtHPW2?U(A4XR9q5J3fK>roy+}gv4iW*~l$q_p5CS=wZFAut8?%5G#yA_3sD2 zzz!y}!-lFYbK|rkFw!~EJZ9)93-}L-CrE{am013PVi7K5;zoljjEJAeVTMxy{xHI* z&?&XLwHBEbk%P(9P+Ti$^bk5TjL9O6@?!YBcp(zGg~;NDKOzI!LlSnxo}{_T=sm`v^rD&0l``?F4QDC=QlAdq&~H8HMwI%7Od^1#lb(bnFF& z_>(9CyCf?MAA$T?{19FMWWk-+R`^ZzoPvd>wu`Zj#|_&=56eg=`&hT+&Qj^&GJAcz zu)C^))*;wmoc#2tZD!cNEX}7VKCm{eahjU;p!iOlhoP4>$X|_H*EDVP)h({7Lh6tG zABv#k{a+0ca4?0L=^(}v5kRMO6_jr21ms7vRwvloQ(oB-YPYXzIvHPfFa!nAI!@mD zd@#GUHnuSHm;BGEkS%g#SyP$p2KA2ONa4kNqDk z@UIHE2%J}iAkg%>(oJNt8Oj=?tDS&-h@4OTD<`#8k^h6V2TXp5KLO@|4u<&WgvRBw z|N9C6(-4k;Q`%}WdOGq(`sWe*hRF}e2)71pRRRmTs)?9TEdOAE&t1EM`Hy7LOJ;`3 z);H9UJAKO(;J?0$-SzvoZvejVL%@ZbWtfL`xMv=@<-v@oeuCG&KH0uH*}Xc`y*}5m zGWB2$HF~VZc}XV%na4*Pm&Bc0b9KmMnBgP&jdid|ez=@P>k4V9%wzR;u1!}s4L4?lm}`T3dmY^Rhvl*{Q2 zX({%uNcSj9yI+_D{NF7v5rr>kdpt&dA`sVbhj@s>ce_|1KY@V#@!8 z(%&-5+d3_u=9ZFuIb6>T#?h$zo>idw7T{$iYos_S@Y~YKi%vy-Mm`Gm;(8bT&2)lPS2U^mCm0 ze_Z&5`Tzd&r)PU_*Ow30XAf5=j@HMHwz2$=zupqRTx9QYJJ#0N2a7{HajrRK5p@R> z&%W+`ef{|D;o9^4rK87403Un4!PsBye2ChtVG^&?y?@Z3Ob@3I$I=lXK#wQWqX%hG z1H;kis3LPR=)KV`8TRS)l;QP;wS}t1*|Pbi>cxeMrKPgvxsuuSy0!6qVWw4T@{NSq zQt@2b_-GWBM`BK;ikC`e=ga5js~3qd&%&|seBN^1#87mH<9XY7qgX}^8K^ZaiiQ{j zZX9bkcpyrj)DzZ)`41>YnkpSn$NG&y4a7z)Ocx?Z0l^ExjKAqr4ljwrjc0QcS%Ne+ zD`~htv@6Xd(MQoMST&&9xs(-86K5fQnTTS>LJpA+7rg`6eu4iWz?snY<7P1-Ccys* z5uhGCxEcV!hcxI|APRS_5Xe6Q|KU(b6(VMn9m8sHstQ#PF0n7>Cvzr{GMz5OHwNYx zYEpcY;F0kN(}Xy!@U8N*`1}k$z#lP=0DSW)qvJRNQb&7T$}@CAGj*d%EpnUf%X>YV zDS_Rzpnj@f583kpJB-}vQX8h^PxkM^p~EDxnUP%70SJ>Z^I>f!3~r(7Wn7>5a|}H4e4p-~nyyh0>W3Yz|1|6!^%%O7 zzE7M5K!ot!N+ih8E}9e+NqNN*N#!)Vm|qxNVWfWZpTC^`$8RUkD99 z1>46rWpf@*Z+tkMJJ@XEBbB|gfZd)o(wsU_8(5xX66)k$5E*fkb#JR;YW2p)-JQ3GOHUuJJl=Zs_3QZdl4GQohSjx8CYr$i<)Qz-s*L%M@|Qo9 z^bLz8%w(Yu1Q zd4(GWictQT!2xH87Akc+bM@O6SDkIIx!pE!zk}g#uOA;?CofHPoFA@8hNEp8Cp#K5w z8y#pH9cUjLWE1Ic6Xj=#}`I2`RLP| zoiFcUI=G(|WkzzhNeD0ry>A-nV;BM#7?yu$NI(e`$jeFB{VuW~F#MtXK`$7h_VDHk zt^)`KLjR_n1>p#@G{GhS78r35a@X_}jg8Lh>R!~lc1Ba@gu3Sct)Tipt{N+aC0sA8 z)k?3r9A9!iBv(D9>iz(?>F|T-=g)O07n3!7n1TZ{8LfCh_96j)5VM^X4T#5 zLc1bn924>ze8NitECYClAXqW;iS7Eh8U}xs2oj(y0p`CTgC_+3lSSY^W2wC9EJ6Rh znpEwOB9o+)D>0EuVJVtX<(BymT6T)AB`H$pM^eLo48ahl18$y%>J&4SVpw&25w|lfxLdZh_gJk~!+yZE!G)gFr z0Nl1%BXOhLG(Im&cx+E5)JpIy!$ihQgN;rM(;T8x1%>16Oz;9yaq*O}RN58a>vh8y z2>8E$J&Qmgq)MEUKYv<|&;=1HP!s_x00Ke~93nu^1NN6iH5k(2e4Ei z9p1T-YR<;$u14CPH#9wOm`6GUm&X+iRM4hIA(VUe^F3Gq{`S06j34slbnX}{8f(kx zsmkgopVv`A5XA2o{wne(mF0d@lm+;Y;s5I;+5fz74i|sSd_?`6zXAW3{&6xSw3=6e z-ec7#!aoVMrv@HE_D>-E8h@*Rpz}YWe))vDGA8_KFu&TGGFP?FT+uwKu5x@XAQT#r z5$ZsPWFP?o1$^x)CO;k}3xGeSDmDc2bFBQd)pxbice69_ylv#?WEtvyGs4p>%q^fQ zt9E*{V{Ni|NrEc?>|Ny&X59?8V`I8;PFN(M7mFD!tK$`uqj_91^!Z5R%w+Z?Q`>8% zM#;OY-D@+QE0axgBCx;@=A`XNY~zw4>;VK6(^ekZPz2aNq_Gf008Rnm|KSZKq~_8X zh=SV6kI|vhXhIZ37{mga3X+DJn&Af{Ko&U z$1WzwHY&hAI?#sXZ$jC$T0zC9QoQReOSNqEj zH!nL_0ThBA0PVm89c*ikN6y?BiXdf_a+;Ya!=Pt!{i5OZOU6cLb@XKQ4gam7^M78_ z`1PiPPI7@^Nt0Gq?fJOE(~;R41@&%pX~&B%<3E4G4*c-vSLAXdiRb9cH*~&CefZHe zw>3Doy0(9Wl;H!zC8Yff9_Y?uXhRQ?cpZGUaV)6EvxK;iLMY@t9xI!Z$FJh zqeoMzF@uztK1yugP;?(9p^u!<-5yw-d?T{renE3UJ?VN_b5P@Q)BJq(++x+jQu)#f z_Wz>Ut;UV{@`*CX+{kNT(gN0UEWEdW5uvF8i4FP48;z_KR)mW&d%0-|G`X!SyJU2o_B zEryQGnV9+5nNbIj$`^u}C2GzPUibgce*yeog5&+4pTUJ$3|(N7bisHke=<|hd#@&5 z)xX+0x70j4{c3ESMg)-?t{Ycvlizi(YS6Q--=jHBE4&EIMg}!)INUBu z?oZYK_{Z;Okmbqec zExsysV3zKf?xS+|S{Au_a9fZ!+?3E$lGtApT$^s0;B_Z6=vIo4Nu-;eznxj+eZ!DD zYR)&(d&)9;%Z)Fw9={-gP}ci{$?NvXKV24BybgsCveO@uQWeKR?v7dTs_g zE0}1g+2~{b%V;SA^O1oCOjGfc%0=|Q{BijrC;;TY9qWHC{1g1Py(PNciD2g&1_~C& zf19>su=f9*@PqKr{~&*_sGiWgOaS{Zc@ZptI*=dee+UXd3yN`N;QX?Pk`6*2FEJ;S&JIG%m_7nJj8VOOKD0w81AGm$vg6|}R z0r0make>kC$befUf8rpB2?h~t66^{eocQey|8Tuwl0|tq#ecp*-=3X(@dQPR$iaa6 zsDFa*mKS~9-^o0}+cMney05EAsHah|mjwxou%~rwh-rw|HNSgT?m4JA+o0tKjPNyY z7v1}JQM-l*9bs4Q!6{~Q%m`bk+TMgTOBuavh=wpRlrw}u`1*N6!&7?K{)dXjf9M*^ z-48U%t1_x?hwM`(wdBu)+;bV_X5FmZ?Zd8jA0$7%uKe|N?dz9EU%sw=`8xIaJAL;> z?fCr2(gtn-V0;PI7aZ_kfP-)w`1;|)*Tbjpcb1{{JlL8%+L9iwiJq-X4%S8c%dDr< zTK`EWZQD2eNu0B--pe&?{?lFE*>7P9qr8?J{BLY4L^N2ygybsM^EOrdk=QF z50HZ>P>&BsQDAE&NA?Ynx`twVXes2Ln3jYaA*p6jwAAj=bXtaGa*SE*Oy&4y)5=oC z++6YOV(I)`;q*%F!hGd;jcY-iQTSLsYrSP!n#B?)vnLX{Q)!aPEa^(sB8LA=!5A~9 zpPe)?Tg@LLHCg^)m~WXtC-n^l_YU}VF~iA>h@pI|j4GFM%zq)!ex&p#OUBb7$N{=? zyj^4SPlXEr!(WKSo0rJtq0%dX$BW_cqq&T57A1U`LZWdqN5zFgs2_{$@?Fl~zxnSw zRwo?X75rlK6AJB1I{Z37b8wTnL{=LN0x3f9sz8LW`~wRT0vCd)1{^`w1i*F?ECBG1 zfiNY;BgVUcxPSmT0cK9P#_$R51tOdyz=()X@a^HU0Q@Ii2+gM;^KblzkApy*jkr;+ zG=)2rE9|~s9jW47YMM6a_n^zAzW!EenOSbimAGh?ur!^Rw!2mR_Zwo=Luwt$M5zKs zB=8^hXq*5y5!^C_*%BVqP#~JKaOj9e6Ihhc!NI^jTF4+ZXmBu~yUw8wKcof^4*3mG z1IW}Mq>R$2!2}mT4WZH^0Jt%kxCNlU7$)W8v^qqsA_^O_sN=t;7^VrJOhO2#hyV=< z8_Y$?#7G`H-Zc?{n7{mT^4!Jqf6AOaC5IMZkOF_6Mm!E0AunP7zX1Iw6rpE`ruYlU zg8p6Z)cLE5sZII)3v~NT-#cjmdCca>?tJ&!_ylr^S3`1mN0DQGgm+DXMWjn5`vG}@ zTf^-QC`{11XBFR^7h9Ke!^=+Rwh6R7;E`3#t|$}3pLihqQMjh6WTb_Q04BepvF0Ts zh$k=UI2*fVK^fv|6Mye+uD^Ano92CEyJT07q7dJb@Onu{Vr%v-l519fb;}q%siW8- z*2~z#Mj2NLeN=#{ozYY{cSTu7Tlr6wzbgRbKm-u|@2G%LKoO*jf;j>|;mjgJ-hcw3 z@atIoc@-j`6Iz!+0i4uPBi?AK0RI7`Pe?$uRIuCQ6hMtEp#_D`2QDzA!|4#P&pDLB z5J_U{Cy$XIfJNB<<&Y+Us9_`Bi^lo{3S@4iY-y}ze^b}RUeCo=&(#*g-_Xku^WQwg z-HPOG73Jk!mR!Ic1lm(O#c5q0rygz(JX$Q143|k6$@I1qMn~l=r(sD{j%|D-J;!s<~IJ<2@)G;^4++8nV4#Xqmr?os8SrBbyVa>(he~DEe za8OfOWJ76GV_9@7G5PUH1Tp`KpN)h}sH3Wg(>t^?N7-3uoaH~*kaAz{Z2tT(ceFRL zyR-iC`QGPGkKVl5djEFe_0i*>Ul%{VsAN-dnxN{}tDMmPxaG!U`G@!)^PeDplf&%b z_DT#R%)fDffI`lL6FyrPJX>ZzoufVxb!&CzTdyo47DI`yB;dTd$ri?jI~3Jq1n7+})-= z-RymYNQ8l4#sl}kK5v8%&{%PFXaLY;n@)M516aSt3p5 z&zDZm7f;L-kJF=jDADaRRXlcT&s{moSlz&3QWqt(chJ9s9@0NTBA4IJE4y2?P(3Au zq8^z%1Oj}}_Q5I1p@nAik$EB;?%A;dwXOMv_k zheF2Ru3;$;gB`5FF$6>``Kf^SvHue@pZFZVK9wK{kRwE#Cio3g1q3!l5EcM`z*eB? z21GDdn91WOvc|LcZO&z3%3dvwmDIrQL67!<`w#lv+dJ;o*V`0l>n9c)XSO+%hbaft zIFzG+hCv#|{O2U#WRXD83ao~k26mf(#USY)iD3){4^V;zhXVTW+T;BI_=K~JahD+~a*&LK=%h?3Cq>A`-vxht z7!7jAcv)f=j@@htZUO9)(YX7`a%V38@~;!Jit-nf6wWIt$SNKi1mw@1Q#=nNFdkeA zzy&}Qia2O=1pKLbHl`}IjM`updDo*fI+a=-Pp{0Bw8qma4dR^cWCxjq-SIAot{iTa zK3UlL{&IeQi#99h6jQ@XQ@m0_Zu;NVyNmuuJybv{8*5%h5xhC!`33S%C_jl;Z6XN5 z^a@S^R6y#xnOTN8Bz9zb7e(m#T3z$8yy||#GTPC|@1}1~==P8Ol~0e-I!k?uqkW1J zU9&>%<2)|g5DsFUTQ@ElX(RvPPt^-B0-shx`6DWT3ES82moEHz{v3{ge}LjPH&(Pl z8jpc2gdga9)W3r301}=F{6|L}3;YR9!Uc>ZX9#|dm7m07|8G^rUsWy<6);*Lc{Pd5 z2WUYN`=d?Ff8rAq#A~Yo_JJw*w6;3f0U3R5IU_v<6N5`81_b_ZaXkM~`{-n&?`mrZ z&A;zmh(9gE+^wU$@1}+NR-~m4wlopxo&EV7a_y9$eum#TC#prxn~>VHAnbZL*R?ZK zw;-sU}ggh!7koAVii?Xdv%n@chOBZ$qv z1alq}KBBoSqN$YBSW0Rr4aeuef)EgQdGR9Y&u^yopX`4AaQNfL&ii-5%{A#`0C9gUe|}xc7!0W`ykD5&S(1Xn7uTFPr*ve# zMcqw<_$R^^uuo#BLsB>q_!bZTH^iERfggy0|G)QtKijB4$brCvB==YGpRG_g#`0-x zbrLG;XqokFb?L*wih^`kx07|GoKfU{U^z_~C=F3O(hr5d} zc7XW{4!8IR>%9HNk=+IQ?qvTCt8RX(XM3S{C&R5U$GdP(`t`&Fvj6yxbdm zu};~2MA=`e-(bh`dc4Tpp1@uxBhhFZ8K%bo9KihVAB^oEjOog zWXAQkxL0_oxwrT?Y_%*cRn9Dw&90O!EELTyme0-KN`y(iA3}no1HMqN*nEur6gOY zyIs2Pc)`U-&A-65U?_S(l*K2!28hQe(R%}Wo84PV?JLu6WG7xrE3vQa5AKHnfrCC8 z93@GZ*cjD0O6QJc@oMaHLoT_uxl|2$xA(fWc00H9y0-S;Z|`?* z?RKnfuqvswDe{x|slQt-gqSvh&4^$j{|A2@9^g(q{L8@91|lPggHvoEpcmvX*{^pn zps)RYbB9NJuTKxzr=J!;XiDipR9X;~5`N`0z*+i$-FQBk0UnHXp1s8fvnn zz{Dnywg)*V5|dKJIPwUC0FFGMOgU)n6rsmi3}(NKm+YP*e@5xI-_FRvBP=TeYuM?F zGJhaU^pXsb|Dz-)qbLV~C~D#%1pWQ|$+K7F%cw2lgV~lDY9_6rcUPRrYYphn59-Y~ zjB~Y4@N!EJc_8Rpez`I8cyasnlP8~^zyA5xqaQCDXdUs@S>`^sHEay@?wSzGKcapx z?QbCe|Cj|p=L=&00R)+7DHv(U8>wHm(orziF!8equT9Dyu0{C&RX0;ZubbEWE$kzm zx$DCBKfk^C`Ssz~m%R0k%gB*C^|MF(~5PzP(q5mf#@t<>k<1r zeim#0vD8N$J3lyI906#AgasG`0Te{wg(3dIdqNrn^DlxRu4-ZOE1Mh10|l}$Qn_iO zb^E4?D}bb z^%RG;zs@?`M&V<{_z3j>Ei00838QLkB!$ve%pL08n68`P6pRd@8bEyTn7zG(cyZ*+HcsenB4XbHx&&9|=)zkl6&`&zuYx$yki;^D#CyEpu&Tj_o6zU5gc z{PHSGbIXZ?;p=W%ltXgF-Be`0k!<5bKmp%L#1m>86Lc#o(3*gK0&YbH*hKi*MFrYM z`D2oU1-KRMo7P_|c)rGdJXb$PE93NyJYN&N*@5!&$zRBwd$ag_H=o>Y8SR6z08|E8 zgnQvOfs24yh?il&{hOqK>wfpl!o2O`!>uCx%)|Z6!+cGHy-kC?u6erxDS|JI=m>B+ zZi>HcrEG7ddfP_b(H5tGj`M9b^zzu=L_oI!BKvMyT(mSjZEXCTk>P*8c3mkf#=5EN z4wZAYsYgD)<`@5%{}~wjuY|l4*;R^ly|+iFQnn5|KKwQC`7i3vpCf<$95{U4FuuI~ z{M}cg!p|94?aJeefDU4_h9PfBks}K!0vYc?nKcXC4|xKMegw#0y4~sqcIa` zLx>}Y=p{#C{`Zu-7DI|(;E>NqqOcQb%$NaYTwi}kd$6`&!R?&Q`uUZbIk>bI3TN;j zw12WtSmRopW0NAuW-U~WVg5@~`I!IH#Qf(>WJ@M<#dF1yuF(4Kh`Na~=2+oyx64LG-V-KlT7Ra#<^=_T*gbgu!Y36_6W^r#?N3<(p#FQ*@0 zJu(0>i8zUDu;={&2#X%11ojOE^t9b;>hkL7_Uan+>7)8#{!=jjG4^S}R0?hZI157P zqp_o`7&hEtlrSp(*3c=zt$@1~f-i6c00_e01qNzf3h0J$aV~H$g8K$(&Vi7r6jJih zAcrtC#QfvmC(p@UAUwhsW&gZz`mDk^8AVxHVE*6&AOTf6fBF)t0c6f<%e$wA4sQth zH@U9);rfxceVbG7mXSjHvUMZu9dd(9hnvRt7gvrpnB(llr|T%JTRVKZ_t%^4k4FVP zRgMuJChj&@?iecF&;;g>g&*^u5PzELT*mx2(o{3iQ8Ly9{saD3$y^&2Fw4N(1|GL; zBkx&-P{5e~zry>hbRI>J*#CdMcph!P$Y+y7=NDRi5%qKI`9&t=v9=$p z{^dWA?R=FWbN{I%|C_237JecE0)_858Z=dYS5t!W|95rbbBKaY6FWZ~0iX}y|H2pI z6wmNH8FJ5> zRKV`1Jzc4v9IYN>_iZh9ZqAeondM?8Wq)IEd$CH&YMACjlUXLBcdU)IElUfzWCTHz zA1+|+Z7@-POqhjRl+Lkj6mQiM}l)ZJu~eL~os zBqYCuV)?fL$P*a=(8ex01Uo;m|3~^;lYB7$@5BXLM0omErnF45IR`6!Taqlsg9K`G z5pSSvf-QW!w*T|<%I6p1wfVPFLhhtT5N(o4;RI?F8Q_o*>69E}MG6A=V?_$Mofu&o zA7&BeXCCT%BiPF{)Y~}FOmZM%jkY2r1iI{ce2iKMjrkZR4PooZ~n+e2YAy+t4MSR`kogh+o_zPlRNgi7B{J z)@j+t518DET0bgy@v-&u7xL$?9edA5wssF*fBF3B$NP8R5BEMjUVgPXeYhdoTjxF9 z+O-F zE%M%4$0J_aSg${|#}}gm;WMy$(HNNjh$D_28jc@m^r;QF5|C&SKNL5>NT4!fhK8g1 zAp{+c9n7{$h%<_sDikbN&(0Q(FBQ)&m(0x)UA??Y=fWb#98uQDR0(i(jxd=!mL!-+ zl?dWTG5p7J_%lWPR{x5Q@M=j3ZL)Nv$|=?Ej7g(w0X4j%*SiH8$l;Lg7T5A3`<(G2 z9#I6DjQKAVr${8pVo9*PMBu;aZ_#9L>rt-v@BE%+)Mzi_?2Wsv%)VMWM zNEDE*{3NI}q2VWd0RVO||KTHsTAqjxJ${H!jzc6s9}`P*^52+`2pS=*)ABu-Pv=mt@mDgze`82Q+uyd zYrAb#+wH0xlO!J{pC12CTqPK!5k}OA0B2K@fR~K4YN$zZLji3eWW~d^*W2gc4f2-~ z(AVwR^1!3D$G4;3r@P;)d(gL!;!oiJ0Ds6qLqh>Wl)#~(AS#YdULpsc>%ovA&;i_J z9%$w9EGeS)P=W?oDai5BBmp}fVo~vUJ`53HL-0sP61gMz_be6;71Eu}-TwK@$v^%; z#k}n43$h4*fcRhLlI(fK3ui8#J%vypg|lZB&!G|WSH;tpj5SCVDLIt7u!i(o>3&y( zZO!6cEYjTVGQ46ta@h~ZS3c}+zu%{hv4$`%2I})#%QiplPd{64=62l*bvE+2seRi( z?WQht{_5s>s+jyY(Eq3fEhva!4KrQhy^#hi07&xGvNO=TXQpbSXXbm`@Sc@*h=Zcp zWdmnp)*AQi&(C{rp3iKpc8pMa1@xU)xM+N@q_^taHG#iC?y8c4p4w?t*rU7{5+Kb> zzbjvW_~(SO9FiZ91&8v-f6AScHzN#RM60hMq5LG`+H|!p80z5_A^)=aS7r5dFu*bJ zk?@0o|L@C+zpE+!rlNR4UFq-j{x=ncV-*l&KWexOAOeW^{E8~(KN5swuOU)W8zoaP zmMRzmBcn+LgA2D{pXds>IP-w3~7!Kcu6mP@#l z_Bm1i#vIYB$Q&r=4-=XH3u6d&Ll|1yyckjZ&GUl#DNZq$k~7@hG(OtDJS{rdnSXyc z_4a_bztK5AfkPyZ)feAW8`)MG-%%OfSU_qj4sR#`3k($yM4>=_LhB1d8wzn32yH4N z0RqCk0H3!Mr;rsQUb z_x902)+Aq>NIz?mpHoVxQJ}MVoOcer1GtFf&1UgvXF8*~h~Jw>YY8pNU~SA%*CzbR zGpyqM@8!fHV(2c;l*oWPF(Ix=QTI|~?!<;V#*>^9NVbtdPAO4#v7x3xUbqgJ1bN~j zU=+W>b!$rr{QQPGX%3`jdj?>*)|DGc_VolHlj<%YPHmDU) za<)I`VE2!k)_>ghF{*5GqH)YShV*JXF2oo9aX(hZH~n%CKez0cIj?FtR(^G%{E}=s{RJBW;)#H^_(`gb{!q**6?BP~n(O(hU}+ zF;;4^|BuZVPc0VD%oRZ}Gg^MPpu(k4l*yhfL6bYwJN&UE{&=zwaS+lRo-~IuS-`1s z&wCJ7Au1jkE2cNPXW5)Gs&UGuhPCzkwha2TPy*UpTuO`VGbOofQ4SbhE=2lNd1cGcNc0RQRoZ13~x z==JF6^XVS)>mLfBkOPMX1BWQY6#ywiL(J$A!abMBrjn=wp=9JQ;WPo7G=?L92uFn+ zXdFiyBaVa6Ie6kwos19RYv88~IT?I<3QJNm)|K6FsA2w}znnZRBP*+j*dO_mGJjz5 z%Rmcy;mm2I!yz(G;oJokxqmC3Ry5HhRi;EYWZX&gE)ujvx92+N1$))RwJcIv#>oBC ztXg{K)T8C?H&3@-?=3#trp^iKMjr6CraQ+5E&LsBc-g31>8M-lYQP0>^O~9&I$wzS z5As(T`X3V%0bh|fP*pb7zHEL)(Om1YjjpMmy^+_gt4=0X!4Aq++V-K&3y14(zkb|! zwzK>0<^HGl>(8F-yf{KIe%tWibx%u8+v}HaXesEcg8xMwuq=uo)i0e=RUj+?D)NYc zK0!nP$^Ldp4t-uI`MP9!9f_Sd1)$_1u$^Ot4=^8yHZivW{)5at#`87*)KK|D<1&&T zPN*uM&{Y0i6%@ebzlA_2@ww*ZGrB}Z5avH#Q7nZc;O_^Q0$F`+w2ff?U$!*Su(P=0 zK-hkDU2P29QFDC9)c5WUKPS@wXYBuGfzH-3-ev6mrZH|6hst`gKD@IGJ6Ov&zk62F zEFJAy7^6I19@<_S+FGPNTB#IJq1DW1_ce@%+xkH6k$K3VNt9xGsxOGHD( zLP~s39lEq)AAs{E@c+=p0ti8m@t-2h|KPg(fa=_kdVE-j55u7jCFp=+5@MoZ9H`5S z>#eN>0WG4Hi>PgLT4OC-gti{8$r$f0)052^0tx;OKzcF$5QICn3l_A;70J zxpAB^^KpOW$8+l1_~O??#Ny4q+byGXN7a`ER%ZC2U$`{IB{lMXcD!?3s7rLPb9AU@ zYOH&5j9X%qXI6q=PFg^Ix@UHhLwvYHV#J-q2J9p3AB^o!fA(xI>{~&}L*Nc6G1p@vA!N&X9O> zYVz^!*4xFg{aNVJQ_=9#?cBL@;tQw z^q13;D2yZ;C8nPlM`b5~9sd8Adh53~6SZ6T-#F*&{mve*QKdp#>a?XoU4aV4-Q5Wi zAh=7gV1a}f2?=o^B!uAZ+Ll5E*S37?VfOj1(|IOWpbVY}hl0CJ`@QdH$q&GzKTBNc>!XAJbbT8O_I zNCYt+_R*?1T@$&rAsX;F97F*nA$6r0Mmng*sKYqODk2dFpu{Y#AmM3HMgsY1kYPiK zRy0H_l#y~ZZUGT8bzB4Fbq>dE+)p`G*_GBhR#jQkYOE_5Z^}9EDyz+lil1a;KTdSg zw~f3NDG8CtLKG<1;vgCD8SDZG&4hqU1AkG-zQW{uZ!Xih3a}5~l~rR~PPe30+m)7E z(W-1J7`E7|=qyJDQ~(?o9x?yB@wqNsmJ7GePbha;66|>#hd@p_jNePDy{1HU( zB`_bj%*AS@VGVp=u{=bHPqrqu;_d+S3`#LkgiIFSpefYl1{9t>Z20eg{d(x=k$p!G z9)L9X@VRJ}3s%ir(hY)w$8F&jZWvTR#k^@C#mr+COl9aqQL^!>3ozKez-5 z@abE?{Le!O3?Z2Qjq@jOp4T@%cii|aApyI8>F^x`{fC#VqCAQknJ>I8ufD#0#KhoL zh_$#~v9S7O_Ur72#rehWTPwRe(<@(bXpnWbUbDG(@S6U~yXTMJJbUQ!Njy0I{(k1j zUuTcu1n{fA9`axCzyK`(?yq~ao0QvLGuLk-6e_#rM1p%^OyusLyjsT`8&d0Ec02~BA8Qgyl zT_;umy_=WyVgB>b*wFOh1=C08Oiix7dv?Q?0RL}0y}IrA%Glog9wfl-mQLvr2|{{F zi=5G|;q+^BWPHI;mw2p?)2n0mwzB$Li`yFD@R=&*=4+(sa&D4{DW2|Af0`=QNXs?y z+R?7+9!-g^p`@#^xLsK_tOa}DzcSOSB-yVt&A&9ouRI;^y^2%3O91<)c@-qP=Ow!5 zCwNkm&{XZq6exm0jpP(l#8na8B5ztciCt3G(V+Y|I{9-WlpAlIPO?rTnUj6t`LIX$_cDX#3vLe~?(p_`MsPm&XrF-n z{hgl%xDf|me?kI``u`#jOdeZ1N>HYI@0@wIh+Y-s({#P-tEkG1jdYxN@? z-uV=WnL;WvL#e4GYHCt>UUETtMp<4OJwG@t);_}DJ1HtGJB3t`=^9Tm5A=LX@_!c< z^fofUEZi3uk$HswGk=d~K^~91oNqhX+;p1cVy<}HfuEX=N1TNv5AxnckA zjOFHe5a>Oe^FEIH) zXzHQJ?8B7eBk7gbYZ_lS4Fz=0q<2miDEqQ#iq`h&>Cx3e&8HseY**c62Y;eVFx62z z-pU$n=7uC6CdCVVmD6qc1ESytwqqT` zfy?#a*ZBxx9VYSEh+|*OccqoRO;3AHZi*FZ5)jJ>h7Slc z4UJ)qDv)Zz0ev)px+x|J8?32HYLc7tjk75i%8|2a!rujJ((`-~3Ng`y`Bs-)VixWbfL z^fWE{Mu^Q3tGw5_@OF>|%Y=S7UdwR^z*-^08{j_xuc8|2LnIvc8q|N5b2Znwnr=m7 z*q0NJLnT;1XaOuo999@y7dFqW7WzKCa$O*`pdSaTyk@BVtwTjvjU=f0xNJNSqJbw7d z$)kT_=08l-e?4TuKn@K2ABkWFdVgLx`q2H=>j>97-mk8>JoYcAa0bN{I=*(gcL{*} z&XT-GI|A5$<$bl3!_kPFCcDRWzRvEhSLx~z=6lKP*7;`$dB0$AmpJ~Oxnp?xmZ1UO z+`5SS?}_V3Z$ESFhQV=y|8w#1ZG#gJFZyLg-#P52(Fh z0c3c3KSCj4{<+5m1v``=g`(!eDG10v+<|aJ1`7yc;j8CiEPoJN22h~u7mp%b_>R%3 z2e-~XyKC_Lj-mO3>sBvr+P=JDXNt;y+vzp@e;&9KCjjVwvl}=S9ZK$SyL@(t-_zDO zGu-iYZg_J=G~S;kW@jq->5X+%tql3^IZb?gnRu>9)*cS3qYwaOhM)Mq9%FdCF0eW_+&C@qJe}> zP-;>=ojcx9H`|jetwDDPuFB0*3q{j|s<|n}#E^7!aD01hd}l*BHl~~ylS~a!RZ;*) z4%yKbiNR(usQ=J>d13fBhv83%C)oZ3;UCIhBH;@&|K1AV2icbsWMB9U@E?HxPyHR- zG9t^{rSjPxUZ1w(>qP(RT=&A1y1#31;p5!y_u1Xe@}^psgs|w+j0zFEu}eEKKRrD& z^%cexb2Hj@bs4ifDL;dfotacb4bMpRPK}?w4{UXr&sgK(oXWM(O_K&^XO`IHWI-n`oJ@oZ3jR>})kl)6{m_|n23k|tPioEC@ ze#p}Mm=ozva_P&`TH`GG?QF(Xa^W%0q~l)6hrHsC_$KLxWS@>HGDxQ1VyR!$cR!%Z zIhj2SqZylHASLMl=6aT{w9vx@S>J%L31*v%#rf) z(5L15MysTKO(B)F>_~7#r|MKq2o}uc|PFi1EerIc5hc-ipL>O(7t}UUxJ+Zw#zO6A_(?n`fglS~q zDshNh9I2=a6SKTInPyq!`>`H|evSs70Y>40MiG?9i3!h=DbJFao~-701W>lM#C7PB zd)iX_T2p$piQO7XM{|6;imbyb0W}upe>4I@i~#V582)iwAhv+LR|Pay0ROS7AfE;1 z|IOhI2uA?_GxU0(`5$KFTTvMg(&CNcqOU|}+)6Hen$IvVE`63qeUj>Z#>L~TJIjLw zPibj@RE+4EaN;VB_9qLLLtFr?281P{p8&{zl|v=lxr$+j%1>w7m*<;j)810qj+N*F zbejscLp9eCS^z%4AD(M1p$K+malJSQFGhQX=bj=|#&)aWd2-RP2-*^eRRo<0m`?{3 z5JG=(t+zlH)&SkH7P(_+4T#H$YOW8H3L?ZU`8s~G;Q96E|N7tm*>`CFfx~-2kf4Ab z#ZlnE0bG7h?9($i`se9`e_cFcPxh_pRmO6uPebjq#TBZLz2yzudR^n-hl&3AadBru zGCfx_)ibmGb@1B^Pp9H{X(oQG2u50-`dJ#9-7>a%aN()ZIf#F6UpNVaAg_+^mNxg{n}FHSzZh>gG|+;Mv2%% z@?WQp{$gZ0{JHvfs2G#;LuH^NnYA-bOG04@IO!7gZaaaQxA*{U*13e z@;<;HBg#~RQud(`bK zALSp0DRt!mp!5_c`<9>uBzqSodK4sjqtv7L7bIf^@XSv@@%O>OY2mw>%1v zDA~tR!DM$qt2kN4NfI*(5d<^d*YIJY`O{42w}qLX+tb^d9SaL1Ys+Kb*V%&|_zz+J zV4WKNitJ~GsCN=E{38cH&rC;Xlb3*NyeKP{VGPUqO85Sy1Sh{)WeG$5&g{m* z=< z-W&e;0YLuwh^CST)X4&B>jSx5p9;6jE>!FE&J1-|y1FB=sVhO_yG)U zT9Z0a*&HiVMafzK0YxdBqlo(77+aTbPYEz_5XY9csL$ntWG!2 z@VyY=biy_6aWd70Msp}Hx38evmB-wUdiwh-@0-EOc+Ftp7;H|v(gxvl-I+1ip3>i% z*rQGCYN6oiY$mrsBix8%L?jegM1-X@SRxNs;1GcNFAc{QpnwutM(7K0Q&viWu}1<( zQB^yZTIszBGYVnYS2C?CN}l9r+(}No8DI7+k6~U?W|~jA9`3I17;`@c=BSwe>jNYr zUlFKK1o9uI1W6UjGJyZ$pn5QWVD(@9&$Mq_TIb1O+Lw8rcJVmlR%%hmab_?bD(Keb zTqhQo{{oLa@ZXuucCO*UaoS&il?0YVXaV*9{2CXgI6#QC0ulqDTcAH_6Wg@$Z3;j@ zSPy|d#i1kU;GRT;qs6wO-@znSo}g6asIr2yP8~bweC zA!2{(865fJ)WP4*9EvW@>ROp)bV|>@yoAa!0g~ZKvlKU){R!?7#j$CvF&=HokBQun$rE&!4$<;RNbG z!2-Q-_~z-;k1n5na^=30sa=%kt00FGO}TAGvG*{?ER1$Nw}q3Ks}GSOk7Ke(-ll0C4|3vL6V) zo-v&HjrNYegs~4{?0F4X{bfSNwddi0c0d$=5I!LXJAV@AT^xUL3;y>>Gy?smp1nn6F{dLLUA8IJJ0C>KEO$7TmeCLBVE*^*Z+r8@sPwp7Ld~nJ9;pI1vjov-I zZ1ET^0QDc{4<={<9+r1p-#!YmOOdepcNQ^YOD6{U*1k?`t&S`&4y`ZM4s~Zpc=T>{ z&2U>$o18wRO_s8<8-Vrj~APHPhkNiZBJc?&QqE|tpFNDCj1yd6|s0sLtM?rjGSyrK1BpUB+ z`a0c=XsPMm6gh`1q{r7Y@-$NJcu)QK$mGWQ^u~JA==k{h3S5Bd#`=TGvcdm^`RA)> zUp(d{PZWRi2rqE{|2zNxQ~v{;k@E%8KFoi>|9R{~Gy>B=_c!5Q4}I+7Sk%$2ukUwZ zEmwKkt$kmb%D$_1D*E%Zqg@2}bK+f9) z+VjN9CppYpNfoy`DT zArR(&7-hb1%jg${C|RBYmOGE@Ef5BY1c8Vko(xS_N^>^_k4hTEPJb5HNUGDNskDg= zns~+kt^aauj7*y#5r;EEAG$@p@NCLpX!B|tld6ktqf8IqPJ0>7_bKH%(|AtBb*{8( z%dC_K5vnMGhSJnXA{>6e_Ed%_6af%n!Q& zD(>nk>h8+x?u6GwTCbYirc3VX%;*Q3u^9^1U>VDUS?XAl@j8uULJBqt48I;x@~)KW z%mTzgjKr=r#c!yt=iHwEZN~6rj8;w!BJ472xHoIGH)o_XbGQxlpVHG3->r`8)WmjZ zVxe(vZ-z|-G-4zb>OW9=DIlQ81~GEY!lZ~c0OsEiPMFj+62@`$#PK&y5pL{fbL<_> zk_y9TrbSuVi^9?uzF7OA0th-j1s%H+^EgJl$f;a^68 zKk#acQu2Lk={WK_RncuLm=19JVT!zY>5t?54ZSV)TezS1DYq!%IM5k(xB@fzEfn@|_3lo45(MrP+Y#s*X<*_vV9=bf)WV~Bz=$jGkzbA<_&@*f|8HDH!QV%q zK-a+Ahjjyi|6e|jnIC+9+;%|(LSZK)z~@f=VnCq%Ao-x+|Lf#Y+<)=mUbP4L$KX#Q z1q@?9@dbFG`Ni>(T{cVoZrwW3ki<%Hr2A(J8|0K_X z1hfMWJh>DM|K3;!3X*+53d)Q3q*C0e@$PxCVT^plk12NH4Q+5A$$nzV_Un zi4}k_{3nKg@caS(0|oMf_{$md|BC<@^I-Rv!7eYt+-a&h_&iK*Ep~sND#YGVQzqYr?DKQR|7#lLlDmwI4nE$KLptoTp z_vGC0B33%Dtwb?fB%MsHP{$Mq<7lFwjA}P>etZr`-TP79`7y1$;YD!a+gz?;NX~Ui z$-N?$g-8|9JDIewkub9y+VdfLa6W77lVEv$V)rM0G`{_WQ_ybd#HTcwu8=9~Y@b?q zzrMM;i%8)0l^>rcS2P@eKRQiCXHRv1{F{V)PwMX6_UGZ{an1Xgruh->hhh3`OHyZ@ zzmx?u*i!&2v-)5$%7`>nEDaYVK93E!jP55F;xNBA_8zK%F809>Uy) zAfY0F=XBBmRzJPj>drKEcXCrlTti1Z@&_43Z_>16u`a2xg`!YLOPffN=5R?ES!suVO@g6hULsIc~ewn zUm9mZe!Blv^s~5rTK`b#L~qV;U)E?}_E=x`D7rvb`e0Y;KwDCuCay~z-QFD2rjF6U zI7k!MrisyllPL}cHl+aIFT-6mS}6?^Q%AI61(hoM_!ZfN3mTX z`>n1rqm{lWEH^DKe@UgkD$2i?6m;Cf@02_Bb+$O57Wh0WKe+meP~c#MW17@eIkIox zF(k$8-+vmmX}{~;K5G-@UC_uG*!BXBFO2koB63nS1_Dke02TT^|L7W=k8uTX-r&xPhK}fF8~XO z;DX*khC5Z(QBvA-nn$_>bbv89r@!7{Qr;qe(LaVrw{-43JeP9(Sx}8 z{(Th`&5Ouq1O=3+_F(m&KlKYD9WR{0!54>J!uAqQ?7tY`_c>Vhd&cTE==$>R4Ve#i-D0dWBX2Sg88pK~`9^XFq?CwSL2S%2A z$}j7e#t46Lczw&k+{F3yL-%)g9ABA+x-fgyjINf@itGe_Rj!g>JJ8ww<^>Kt}*Nxyxw)pP(Tw_9x7;{*{##Ol zUPt@90y#h21F4QLk?^>e^M&FMdmmJLyzcon0P}Z#=xzVd+wLF!&m%9JCjpN176~H8 z2A1X&qaEReDb=mA@%1lXcGkas-}tckt!KJ_{L|QvpPPiS=J(C@Z=bi87k9VUcDGiR zp$_QMetSQ$wZ66uwJm`NZH3dxEb;gXP?&XUu_ec=U-;RRY!fjTz7F*;umlv3#)Q6O#YpPE}-|GB&I zeRphPJv2?|QzE}jq8;<1Tuv@Bp)s6WyCOd?Q5IGc7nZW;m&@lD8+X=+e{6mH4tJmp z)%tSz$1kD6=CFdA&hfd`??f;pvVga@w>MX|-jB{JD>RLTDjijmXPr^#S@3;k^UD}f z|EHCoM%lB&v`L)s1U@3JyFlnAf(TR=B&qkWMer`yyDH$ON9wyoNt{R?BbJ2o4SM~}ec!&Ug#$^CfFCv37`CG_WMf&X-;sJatW?Qs}KtC%juovBLHe;q}k zAJz7K`5{ULob3C72#rGu*m(A=e*2^@O7gHQkr%ePR zq^P#6X4t_kr=Z|XAt!SfrfY@&VI0e_U((#m)?`5}2 zN6`MOxfXN+@OeQkH!G?%D=2!D9&;`*?6h~mvozTL!!)BI42@3?&uWlhaX}CVNu(h% z!tFU+%JE=U+Lo5t(3mg_b!XOkvx?s4hFtQ`d6L1lt7ci2k*|eVAGAq-l*qNOtg)kW z9hkNM)dKV25kXi(d$ENfbyAYJfea}GEGBB{_7!zr0-Rb9eD;qao-R(;N^X_=%h}F6 z5NYSPmNgB80wzIkZ{mbW{-XLP%ubhL7JcJYcAg`TtMwe@-8U3INFeZy^61-uJH~2VnaT z{TI|;2xkWbMAUr3;RmM8XW{>h$sfmD;_`d`G$wz%!u$b-p8$M7`vI%}_j3dVl$iVp z{09rdNxWkIM}q)T1iv60m+=su($_B?zhiXt*43l8ubzBx6ZId%KkC1+%}Zm5f305- zZ|qHPJDFkrf9z>x8tO=@&JQThfJG)iO%`q!aPGs-@kWZEZI7m$)Rw)(lYyD_vhBd|C*q!dD6 z0{{0ZP66ga!2WxWM{c}(Zk%g28E?FB0w};2B)R8PqToc`z=;zf^qEfUQ8CB67-OA9 z9gTR;8t!a*KlSOy_T2aF(Z$90o15c1>+Ifk^pv;pL6!-@82-(pfc(Ik;~%SMSHkTX z^*_KF#UIRn@IP_+ed_Ck`v1Vo?l}nj0d5bxtRDE)W7d;ZmrEs&GoczeEGDqy}5;a zMf3ph(>{EXuz97WWd(FbA&-|pFZ0h%3op+1&rSEtNb=1|_svf8%};kqkAEA3;XgBz z+mu(^8@{d0v2=er*4Mhv(15<=x_{R?kdQN8B|87YCVN~ zFJYYrP#yRoh!hx8L+Y~36GKe`D*Y-I6sa@VJE(x{ZS2U)2&LW4e|~gV`M^N-YJoPNt5LHAPArLIi3uf*R|JY~wv| zydl5!5+@b46?2+0uw@h{ntDI^+c?cEN*q+lb1SK_&#m()<+>DQK8u!;YMK+|4bc*L zm>AJ8(m)ZCQ)2E!KK%1(wnu(jRnM3h`PRdI^u9h???mUchaO!KT@=7wk!L-_rUp9M0n{I$FTzRWDfUak9K7YqyDR6J5;f4&9T7$VG!C%oJ0wy zAQ)3<;ME2OY2Lg1N|!REr%A$uvJk$Of+M(u=TYW;-pNtlI{$SF%eA8F4KedG-;`E9 zFDQMHU+^fEaydNGARzl*q8K=gpSU?xj!ZO3fP|nwg+sO=6$J>DIEVxJ@#I$9S5#P+ zlv|gw+?YJinsVF1m|NlLk5d@76)docENIl{8D0jiI0V2`n&(L8*j3d!F@AT?%)QN6AuDp0{KS^ zAj90F4RjzmsX;&(F3I?TTy=($8C!Yv^yOcE{Z;?;3BBWbf58yq*daZH0u#}Y1O@c> z3&+Tn=`C~J#j>i`!S+s+;BvKKeD~}0kNGMUH-l9aQuT z-H`hWJwZG)rt&Y1;T zJ0|$S+w<(poBF0#Z+X7B<6~+?aj~GdJ`A^h5#x{~E^7YJ^>KGGo0apx>Dd+2yO*Bd zy7K(?$vc-08=b)knDGBOt@j`BR}p-FijV+60{pMT2M^!9j?DK%gy+u{Xujap584m$ zhM4w`quS%ti&3B8{}8Dzg!3B~gumhN37>x=0uuHAI5GAU_5T!#Kjwc>L(vfkAP6$y zJt8QqApi%RymwRIf0xT?X%T$qj%4YtzX=*esK#YU?=nY0RKJT zJrB0GP4M?Bppa^ciaQh;O}sEpag30WD6dVD*5+v?IqLc-9xbFQuTU*+njLDJn|!|u zHs)6Q>}box!28W_!(XPgW4*%*GviBh)9YVmcUDyI2gBg@PfZA*rTBr~PgHnf)Cbz* zo*R#fjR%z#Gc@*0enE!{EMS7wIn1;FUU4GqO!te*&oWZSmXO>_~g_%KY5!k8RlMZ>_9tt*n0E*!+p%fARCz@!`dfvs>F+Tj&8l zch^5JHHjtE;?i;sH-}vlUse)bUPPkhhnM8|=cRdMCb?(fAd=ydoe`K{k7|=`XH_Zg~w|iukon zeB15K)$i-mtAmxD49CJOtJL?+AJ#tZEOdPt7tRcnjR6&rg*Ax+p#4|M{H3x0c;-u* zNMfExMZi^$49jE@xlR&^@GrvfK^jsg4?!$@oy4zJ;?1r1U`ahVa{pSPPZfsPGRK_W z{MNQ4bt_^`qQKG=349n$QT6R94XFQG%>R+n#*lgq3E+>U$~imyu2bkEhl*f|I-jmB zsL|vw6cifiiSz3tkFwvy2?NV`?xigIT#;8P*R?S1ailbotxAMjnp_bqmIu_~3Q%HG zWV-)(^qa&sdN)`F1GOW4tbsAs$WZ0TM8(ulA%WGmCbf6v4>l#VroGJfzZ4p6Le90N zvI5xf-qB_C%1N3^iwdSQTjD1cdr3GBY>pGF)Ut%`P?2X}>~_V+;k;u@Zp$Qlx~FiU zCvRw=aB?tjvM+nQCzF`}dvZoQGlyCz-Kv=OMsjNtz#l>pKnTQumJo^nq}3x$GFnyX zQXcy#w#vJd?N!e4D64TVN_`yjcE8!X{bpfTe6wFBS6UV_tcuHD=hMxL7_UnTpJt}q zijKb$l6{XNa;a$!k~9U1m4RY;phSi@@HmCiIY^9E0xO2dn_msGsBJ0Tn#S{}5%}_| z97@T?;gox^WmY9jyUNP9#TDj7)mFtx_sBL!trPAbYv}&l@_UKC$~3;Hgg<#BA9U)c#JqUsIPUsyxp|}6!q5skQ?SD@0 zho4)%xFWESY-IQNO{9lcVT^lDOdLD6vQ1d1x7@m1>6?fj#w=SQ#X?Viu{IP2WN3Whadd=Xt(OEPF@P7~luXp{_5o3dk zrpC{G-dRO@T(!J^;q|R+HV+;IzP)5)a@pSGme-3cMUhjwuUm@G_}1*g?$X%jDc1-W zF#oSTzjMpt;mLcK;UjeL%IQCW|C~Pj2mGJ)VFY^k*CU_+9r*W=gDCqT{2aV~87eSr z0SCbCzhVf-HdJq{0DDkB(F=&E--~B)`Gxok9RZd;VD0d04y%w2z=?7Btt@4tF$so~Rno`XQOCGB2r7Ko&6)ybv#P<)(S=!%qrUxEo8Mj;`ZV1=H$MAgUGrf$0)EaQa8{)G z(?Ix-^U9~-l|cLRDV}*0bOCqt0>C~wvFPMJ|2R0>?+!ddyjjC`_`9MV^&Ff#~!ap%&)==Y7$^%d#xc+bMZ^u|Wl{HJsX6LaG1QzI-B0?kqXqrCsA|7Zbl z^+(Px0RO$o-x188hdvId|4;p$ApUwxym2-Salhwn{f^?-INdkByCxp(QqJ`2zD+4+ z`vn6!MvJUO%8M;dt*B>=&rj|A*jQcuHrlD0AMN|G_Vwr1*5>N!=GqF1Gk_mlggsM749{50pZ1aE3?L}hg< zS5_qM&SAGFq`PB>mHZ zwBId8FCue)WX69YlK)D`J)By2F1zAxRqbcT2*0kb}q>ThCgf7Xm@oyhZ}v0RHeZqz!T5~^8z%A-hm6t5v(ri_xx z!|Iix;%cV~>!WYnjeS%_+9}!lQNeh3b$@$V_Yh-bls-9BG6{-ibF{jzpkI}&j(-#% zek-cPu~ePe(w5t)$!O7}wdyjuT2i|tVG6Jrh3+Db10+$LlGla#Z>YHz)S$cJkB*wr zd}*_s$1WjWN0=%>R4*AL9NCwG<43 zK%0R*QIxhVuC;+A%eTsMz3A$6#>V2X>GOS$&HjGka@scXrhn3d=paL%1e56UH#tnJ zBDzI!>5JTqdz9R#DRisCdQX-*T&@k5tAgO3s+0%HWPwr{asQP_1M20W5`iZVN@1Y- zkPNU~s(GGFx?M@^t%w8@a_PIGYTGiVZCRBCt>RT7(*{bq0=s z=*X^jsTDy8j9f5J7T=#ICDkioNfC)?OC^?qD*I~CP1P`5ibC>c3-UMHquVs$Ej(vJ zCy2X1Yg{YhlC`nA*0?svpM?R$2?;zRUJ$z}MM@3MJ*R)>0E~b1Pw1ge9zKBjuXpl@ z-kGDn>F+;$!{CLlrF(J^g_G-*6=9X=m!Yb3OpB=LSL)VABP$Z$20IitaHn=xlpp(J z*@cA--1gPU+`5Vzw$C1Wy*>Z(=83z8aQ;7Ma@FAWMHn@p_@nY4zix2C=p2y+0BgA0 z=Z_knIsf=7j>SfAO_G?|PKmy!UtT})^oo)5!yB%Tp9NcFii?^)wWV-!97s;>GhLr| zR$&Jx>z3WNe)PcR_=83v|5)ghl}F&<6UyLj^`m z{uujD|8^Gp0&t`=Fn<8%581EYjmt3qhyUC0JJ(K_TsM4i|LW@}!~^l~JLJDSy@5l3 z&5OIv;Qzw~+WfJPnTm~3tohHoiyUNpZVLBUE_3n@xYs+?8XrRx0l zacmvl3ttDmer*3RHnOrXx$^D(>eu9=0&9d(rgqJXdqWN&CjW4_y}6t1 zMSTGRg5f{vKPLZw@PAbPhhFwr0bu+8bZ-#=9E3~3^I&J2q##;TonWY)%q*$tZfsqi z>_*(@;7A_&SnF@YXlG@4ZRzXQ z>X)StqYE&_7N zT=2*};g)#FE9pSeyGq!c9q6zWLAQ%i)L;Z}Ae#Yn+Yig`|x;uAJ2I6I`N*bd`xEq&n zKT%0h^dh04Vz4b+*PO0aQs7zu?=p>yq=E4T$FYuS$EmTduCOSfyD-wsGM*hY_kIxE zQ{FqxobJvW?8_bQD;Vvej&4gYZw+~ zY)1yil|i>h@edEX8d&%?r_!dh+_JFRwv=I2TK1~2!lICFT@+^==5Wj^_i1viLshLU zU0`2R@5&XrAQ!BL<5?ph1bt$8loaV{$g$Z=NxHdE?}>tCt)e-u5taD~ODj7L~Wv4e!pkuZ_2V8x{05XVjL_nuQtl z^xQ^faAmS!M9t`wyCera@qLR3_%rt}LGxvB2ND27r1ate5QG!(UKcn+;Qu!bj^90Z z^1(&@hZioI8GEOP+QoYrni(IuckZI?ZJQ)F?yz`tcdmDRsj`|NJFHD|c_=6Vk#|6Uejqv%rVu&|T{$dySFYIrC72xDP(Ef=QK(Ii6 zGd#8L3Sk7NcjFSw{~`W8aR<)N*Ys{&)W3Hf^ZzBYhgV)by88Apia+olP=HYXf&big zf(zW62cB>4xW94Fie~hw!M#ZlGUW^7wd0+sGFF#%5~Hk5AsOxI|2(Ig9jWir z@j(9RYHA$s9a)-N*joFxvHERod3xa^6d4~j78ic3>ZV6oZL(-azCVclMM*)>|DygA z;6KG1H{V>;|5(&~*UT8#EV5fRG5@>ekWv3#a$^I^(#m=o>gNWy(_O`Vs-o`3!tN%< zaC~Uxz1tj!^zS2OTKL$(-yJ!z>g}_VUI$$}|$~%5)XZfR%;Q zJIiakyNW)og^zRw)_?_>l_Y3boPYrzEgbeZL=E~CI?Bx3LR|M>Cz zK&79!%z{m{{T*XJa3rGmZ-3t+exc3ab#-TDerKj{Q7jr|G)_5ZHt5@@T?#2Mj49Of zj^F1HvEL@-ln>=}V6uKdl3{G_1xn$i)ME3hy6ov$_3n>>-Ji;ZuLTXwMYV$2`OjPb z1jB#-zP7rtxwW~oydx=)urupgD!Vi}t?HC!b&9$J$GU z#_^mTau;NY!um*_Adn&SVT%2DN_2;CsS5N(e_>;gNCpY8dzHwmEXzDP{$YSNt*$*= z)t1=Q5wC8GQAvH-@(`Ai#A=AHQA9ArftcqrX*T2n+fb@wXt{TkEG@sC&g`sW^wzMu zsyVun8XhUb>56Ii1GjS5%o;a@)t1zGmL=T`ioG6C@H$Zx%4v#|HA6uh39HN)2Ls!R zu&NQ!7^@8zb3?cya(#(y5%o=;G+N$YGB`jRY)#jw zQ<^jx>ZTMGI5~B`a)GCe>m=s7)K%Fqip>ggA7^H~%yc~CYJ1+98&x~Qn;9z`?a3Pi ziKv%4+LJ%pl|RyzJ=~K!(vv+x;7f@;82fSgCBXmx8x4cupRfsqDd=7c!2J~BtX7J; zA)-FVG|~T(N8amXb%ID9DO83En?fYbz;gn`;N)c8Pf5K+Nxw~j+Z**!YQ<}6om;io zhs|}WsQ2MW{rJjYi84fjTQJX_S@pK8+OnMQT2o~Wv2bOr8>7OqDA6P;;%Z>d%k(Nc z8r{0I^ewf*s*rA3Qu(%|;&mb0zKr@T6~}r&Ks<-aI(r7+o{8aK=*opz1lI!;Af7Bj zq=+W=3y`e19-K0piaK8*3^%lZdLq?YQj0FCRUNM3y9(eF2m?}#{jHExAe5P`L;WWV zDE#W`14W`B0oRYA%96!6g&+KD-=BZ{b@J4SBPYNGIs_v);6H!rANck3fwvL%QLH4K zVvjw$5>lR2*(aIXT~mJ=ge&>X?$Y?q*XiAF!ojwhzNY$x{^05i-vUbg`|h&VI@3_w z3#P`GUKktPy@<5O<0$pl&%&$cIKZE422cSUzM_BR+G$uo?7MVK-^B2`<-G&9Pe1U0 zF@ouZSH{PmTs-^gx=X4zuT$2yIIjCNARE!}I_pDnLilRo%=$O&M7uA==aKXCQx7ly ze*Vbu8|RK(IRgoR-o-Nq&Yk#;xc{Q~ANlL_@!w%~dhG&uo+#;v0E7Q027bW%5O5Lb zJpdmVI}l+0*?OvL=nwz-4 zdE#q*%k8yYQgD*EIzd!bqLoXh1{!A2@Ol|t&5_LFOese`Gu*#8*D^gQ?9-O3MHQO* zYMqSVrIPk)$3B1fytcHsxw^2v^aZ`(=jOuhde6dSO`9a1TkKbu2ntX@X|iWtoM!=n z|9IslpxV1)=Fh|do$QLqAB`ZJ?2;4XmKW;`3Q$RMRuhjkqATxLCCF+r)PlTrX|j?_ zuB*sViG^eRU0(?2=b_c*u5X`NJ?%kd1t5Ro`1_g++fR3_0H$F6{4@N+@Q2X(Iz9>@ z$Ul#f+vpAa$Ns4wuple~z<Ft@y*x*w(lC?`xlb zZ1l{IIz{-nMfk;MQHDnQb~aYOf8RnE*!c2suCHz5>)iIz(&qZ&<_Zq0o0#~)1Kn6& zoak))@VnjM~?%*^YmV)XNQ-E3Aj zi_^!hZ7*Z7!%_ooTShh4FyAc8=d9O@KVMUw3a8l<@1c%%=Z$pdj1J^a^yiF&S=0jm2h=?Wpl(joBsd-u+tAF7nBbmri$- zs8Rpz4W3`S^77VMlS>9BmrmV;?2D-XhcBHxa_QvJE2nS{hX30kbOEC?NP$0m*Wjw< z-FIP5S1e7?3yzqa)qi}ERGK)r{(kuDq_{^pwlzQXV}VkY5}q5`HrxAt_ge-d@0{6{ zBR9_+zJB`H_45ZWoW!GtI*j_SuZQs8-%se_5CH!-#QVaoAHY7gfWHar1_Hw&?z}ki z?$!VOumb{_6QTe>Ko`#aa{4%0!|!Ja=BM7ZOXvci0R4LU1d9KkXa~rABoe_0IuO3+ zLCAiuoJ&q5eRGqG+bD>epEp*%ecuEpa&CJS_urAtFC|TN0nmIE#QT>ddgaIA{tLnnia#;= z|Mx-tk47VK$&SJO*Exrb6L3&@S};93UQnK=6(-7SeCXL3Eh1X4nmO7on;Re6T%F$8 z>|gxWzqB~Ez23XAlqTU?#0R~K^0grQzmD{N9)w_b*O%b`1VZFR82djY9*0LL{s=qs zv3ulg`^1;n0v>oF{=oi4fYS{pGq0kAy73PAhrx_yQDA9qSZP*HL#^)f^uiWu`sVw! zrEGQyDT@-HlaN)AGBY^@J`U>tkDc|I4%K**WM}a+p!BWp0BM#nujAd;>dM-;T} z8%x{kYdf33@_&MJ|8a7pid~vWO;0M$NiHv>6c@!77qgnw-_|zJB0$L@4!xNEze7|8 zR0bd5AADwS3qT{-`_$t6+WNQeb3^N*nn9LeJic0YFQDMOXR>i*=Cz=dtG_;DgSafOudjccKuFBj ziMELe?bOoy^%>o#ZqBeWy_x1zm1SJmA=sZPQwJf1p8ds@^tCB^R z3j(uv!Krl-8Qg%R8ea<7uJz$*^`x|hlw55gt%t!J5!Mci1%sm60Rg{{TiZ?N2+0{K zZ#>h?{LAbT=yvH978$hHX$#I>sKv|7RV_|QG}G| zThDb9Fzu@I9;X(($;f`0LB370*k?hyMMA%r<9z5V9_lX~>dqhPp~5+Lv^#$o^}mlg zK9CCv(5Nl}!@sUMMyH8Ex*4Y5|NkNIf5I#d;16;Na5;q{EUW=V9+!(k%gnIbA^Da$ z5L46#36RxN?^`GG6f}j&G*L~6NWk?(=EJMDETPt1WpXT1GCPFT@Mxz!ou8Z!0c6`{*$Ci$jZVLY&TZ1 z6^-jv3oU~thVa=|g*0g+T7dt+K91qcQG_)D{BI$*v_J(M)!G8pLqvn%|6}PbxY|tE zZsDJC)_2Z3UT>#H4NBczXsMSPlv1F$yHm8dLvZ(mU_lZjK!^}X0&&4z5}a?}%scB| zS!rl_$~+1D0l(8+44u4J-vB`t(Pj;wfh_x10;{eJxDu@ibH_Wz4eutVT~9w1nh zhc3On?VcH$M9T{-PjJf#D;;XeYA!=L66iEdL!ExVLPB$sWZMgZ)rq1ZM$6<-SWRXE zC9j;*ZWihUJ=eL%mrvg@IB^4G|C!Ub&qMij;_BI>uxq=d_wVJ?(1n2xdhF)8BRAl; zulL!y%)C|K7!ka0)^r2%_W!Q}ctU`2h_Dk!=-O+_tVo zjbwXOx~}EU&CrI2nPVENnD3gC_%6ilbEx}=AeXnm|8e&9fb;{v4w3C>89Sw?w>50V! z<@{_?b&h9TsDE;JV8YL)mKyEK{MN?mCipmW)3T1nNq*nV|35;U=nxN)?pV zFyb?FYyT8+`B}VXAVT2AxK_0WHFQL` z(L$TyVpQQ!U2ajDVVs!qDmKeB+2xY^`-2}L1n!CI8mpQZ&XI7_260Ll%o5}BJCGsa zrHu?_hy|HaVVaZ^CuD{K@kY(>?+JnUcUSxs)CWFf*H0oQn7*5wi}}9`KoC5lz1lnd z88r9$B8%*Z7eBr3dKdgCfQ@RSM_s)u1%|5>Co*`gG_Qts-^PCAu=_OCBm3rUlK&O2 zfGb{c&%#M2iKO?bX)hCVO|p;8*cUYlC+oczUSS2E_r9XO)B`5jhk<&8BCM1 z@=Y@HKV|2F{PQ6jT_6wb0QcoDq|jU5U;q7_|0#uRRf_LG`CidzL$1dPU{l%bMrrqL z!VRb$!8bl_uz<+^l8f|YM3{94ccT7x`E@h>nH@fzl~&bdKWf_jaN6iY3+N7Db_WtJ z5ZDxOFQ|2@frOlb6M#=;YeIv^7q@@@_~-DxgU5~^J#Yj;z=r?<9X@yT_tOW?Kf9XV zT-ZM&Dq}UYX;}55F5a|=KFn5b&2-8JB61RA%SeKyv8vwIz9rSb&Qw@=s%KhwE~DnT zw@)v>dvfXhlgl5UUj6j!>gQ)yO`k&< zao-v$;P+1*zud8YXP+2M8DX<#G^PEF7KNa0gwrVE_Ne8;`3e4{M!m5N!e__$NI`FF zA-lCn$)$?>tNPnp1bsu}O7;BAjCN^8w>-Ky%NrHfaoXi8(=y#$9zeeI2p1B39wO|L zLeT`cIqmFzb{Mui~W0=HifsJRfpqQh#H3 zds$#}QNEA~QwW+;T-ejqFf0#c`>)Tz0i@>(+U%5Oh^3tw+gjCPkSDmD%X34#&P+f+3DI$+ERGNh1^ywX ze_%gbn|MVpAg%yJ13>);`UB(#Z9uy=JH0$Jxv(;?+nV255N}X&d9)UJVWZ%+dxpN5 zzrJnozowpNoPIt@&bMi0MvP3BFKiSoZAK`jgO#%pbb#NrF zj4WyH;MFxV%PTvw^E*koeYv?E$r)YAS^XKg?Cg9&N%=@cwU|tiH8#pxVOK;G(;G+V zjpCLjNqvKqT;HErQ0e(I=Z9a3Lqze9=yJP+DyJ0Oi%TrxntV%T<-Ep_Dqkb_jx@Te zQK@cH%W7o83NbTlV4z&8rcGD+QNvAQhAW0;H7ZUHztE;I`)dwi0g=mZ38WRn(9E%h z=G)j3&hBx+LsvqLx6kiGXHnQzpwz>jfvll20(ByLdp;v7Dxn^ zb@;Zo!&=R@IM*UG;E6vNp=9?en2SFUq~?XMCC6v%}IC^>2uLN@TPzA8^A<4nQznbKah$(XW|x+ z_clG(Bs1?LsqkY?z6mMseOj(bTG5xR@cRMp_P-&$PpJJ-T4PaC`>m|bs=Cg)vev4+ z$%WkF4I^ln3qhgWT==ah3-iAt8RpepA#m;9O;pd;a-%-@#LGPTON> zbgh=x%o!JD)D>j3l%zBkGROFXh^J5wGF5}F5kC2Cwar3STv^WG#`NIMTvTOxU{P!W zIro)^*(u}82G6dXe|lN(=DE|i^!4vv!u)?6^Z%98C$H;+3v}cXaRS(X`2;9H|K8Pq z;qWP@G~z(d~^5MJ(!4IIeJt709+sp^!A-2=6^i<;Nf=s&|i8-q4om*2Y?U8ehmDm^Qhr? z{uA(G?EmZBDWE-A1i<;n%n#%rzXag(&$-ik^iS!VE#e4`4Yo_LLjX5t&;-3Ck4R9(=sW*yD}|zh@Q%#LIn^& z%}eZW%;2?>$AmTVfnQBEsjZD28pRa2`kQOD0`|AqAd_I1kHO9+fkgcW@&njsH`tNL zcErIKIgb#0J>3=j8aaJ?h7*9j*;6|+V<(GOZq|?NKELp`D(t6qO^S26n%n0TBQTF0 z>h-P4$z!!hwF|S`8&&k?Pu}(>-ZsvOLEdQ*KeK*Cr$kd~OPA-6NVd4Py0osH10!^l z!&+8J*LAa-+uAK?!!WcjF09YZZs`^_b@Pjg5#99o1{Q~P?e^yC&f46lh%4ZB_jS=# zGRfMC4u1j||Ed-}0^I!FOY(mm0Kde8Hn6s_JiRcc8lRh5n4LtR`_}5%PEU=PTF&PU z%_Zh_KehgK$s*{IUBpSdkkekjE=8u@N-27pLw-}m66Akw=0A-Bdh{mibG0KRKetkYFsTQ4UNokpj`sA8at9<`3|?IoySfDMzJNj%H_&9w&5D*5Wox^#yrDh3KA;QT1+Cs^5h_xrxRnQRqpVyIBkpTZ$o=46>?u~JyHuvUr( zxz@G1)w{XX3mON=hns-96q%AprfI1klj7eccwP^9_2(P2qo!o9YH^WNR;(P%8W~6v z@w3Dj{z3cUB};@PnIKC#lqq2+4t0g~AqBW21QiduSJ?jG6^lS`R}eng1^+Ss6QKZb zPV2_}PY^+ooC~9VzqU%-vaC-jq_1hNu=M#(LXoU;tfD|t?OsoHYpi!^g02ejUhr6G zcE=Hx)*IT{>Q$fnCDZSwxA!fN{IBU`molQ%J4(1a6?BRVNaK9nwMjmSLap_m(k9^4#IQKx1%?pr`5fs(7Y6Gfe<)={L_v6 zmrq;cxEv6ycH}mSLOMm^(pGOWKK5!T=a0m7r+4s-U z{r_j*?`Q8{Xcc#luFde2qQPlJvyhq5P~0KqiC4yZWc)Pu@O<`TrC=KMCgl*<)AFfC~yO08HDU1vqf|Bq0H~ zd+yxxtMA;t-Z3)*=ydkwm7A8&A3K`dw|Z$7ZWmIS@XYmtYm6s%P9Wcz7OkrLCxvb? zKF{sm-~ayN)UzvRjjkQNrN8gO$peOZ2cYDF3+U;i`_3LCv|!+W-U0335EovseK7ok ztB=wR7f_UL5P@(7_{RWL&$AHuV&>m_{_Ouf`7dnW_8IE$Gd%a($)i{h4#F(xJV>FZ z_MveYqVntQ0nmh|a0$`y`h*w6Wqq7|QUCRT|3AEGVEo|1>qmGlzkhP&1L{9c00jT% zKmG5W@1Ov^ePm;D-{$?-Nbk7Da>TW}=OqVK=7!f4L|5naPsk(-Q`}KmCE{SZ8&X?q z(>v>OSxvQ~UXd2@D{IolY2k!IHa9V(mUapHhi6n%o6FOi+Nmww;FvO(MhPrTbW90F z@pnxN2lLYg$WJ`+SjPqaNW?=d0@m@U{~_Pv{18L`Jt^o@w1<8Eueh$7`0g6dnoRfd zw1hq?X@FidjQ?=k5*Up&BZA)P38X-3R@adKXdV~*(%bG6l3(EY>|=}hAKXr2@^`jE zsVC~cqlJ+J0r)(1G=F4k`d{&X;cRK_h;`umWBbphKV4c?gT0H&LQZFmjL%u0s#ghu zC`D;>3U@-Wu(j2%8L^G_vj}r{N(psI2@T4Q_KOXTPmN?TTLACF?EzTO@|bF*i9EsS z-dSIQTx)x0dmWspo=$ZyeMh^1yYBY#!shbq#^U7K;>7A4n&;dO1jQ@!8}oBm2UKFI zm^(PDnHX1$0#zcaJ=mkW0MLI;U`w~YGPR@;t0zaN7Z+A$CZI)IU!C5Obxn~oSYv`^ zShD&CRo?&f^NCZ!P49&LRz81Ny8mVEcE~B@T5RrHa<}84#$KTQF|4s3QHD>?m+fp* zc6PGGDwn)Uub+t`-iUT~l~%>b3NO&jtP#b3NjEpOJU5}$&Tq_(gL=BYw6qGc@AABM zb#`@gY+X<#s*kAWSBlz`dlU_tu54E5kMPQjQn_eYIWi<2I_vEtpP$jpLS$2Hn}yn z`oK4}9mW^cjunA-y<9HZr<%m2e~j_F>*aOL)-@H*vf3=HDP)@3yor4*Y=JoPYqhT*4Q zbE|g)f?%55>N7rO<(TF-dN$GnQUB=-?{=ntS8o85=Gv6^wYbv0mL9m94uc;M(g3u- z-TGhcM6R%}sCBNPy4BX8{zo-bhL;&#dHDPP{o~;NgNF`d71+P`C{kdK{GWZlow{q# zso>0PE{)Ai&TeZpJBvm1I#Odrx0ENCkg?^$UdbRbe+TB3t_eRw3zN%u?NvN_^hX&8C9>00!Y3-44PM>6 zZuS_513lwQ4;|mW3kF^Aom);wY*UtJ_Rm&;p*xG+Qf^&$lVWRzr5W_j2)u0a;M}tt z7hm7|_r|%s1}FEPJ+}WGj6hG|3Jmh+9)tp%JPKzv+bbz2nY)3X~6!d|9cE!4T_#+aFB5OM2P%u z3%CMs$?)*ai-&GpKnplUn19~A^ycx!HwgcIeA$G!0u$uVFE8(XdwcKudz=7>AYdDl z2X-Ic`rCn!ZyaO~1(tcde^4chRF#0n4u{wJ{rBm`T=1wj90jW4Am$;;G#i_AwbUXu__d$Irx0f_Ip25z_OT{}T~3yOdW;<{@n(16HwWN@ zE`Zl3XaRO#jh!u?6A;kX+ZJ!Ee)(p1P)m7?292;@HPpGF7~Gy?YDb%tgW}~`&Eg`d zzQi=t#W^kXN30Ki7B5nyS5jC+W=vK=#;|}(pgOprt}HI9#j~;j$iPthL8#XP_8(!Z z`&#Bl2G{1Mhy%g4Zf9c!b$mj=o)q?P!Af*%WqWINXHyH%L?sl;2Zsi_Src;2ta4&b zF%Ck`+A`>#D;pr^&n{00RWp@UQt(*i@q`imLk>HVU4Ls=_sAZT-~bP+0LJyi=_9z zaSn}%&0d&Xk`Jlsa+=l`0W__z;(t`TzKF?xMkgPh){M?CuB=W@F3rv?Ex60-TY8F$|+okShs(X9zUd8HB^)VHF-AcUn5WPT2Z&$Up zNy*fnjO>Pp7;0!-7n zHQqFtYLOQ6H4S@#tbUY}H3XDqD0`&btv2C9I>o)VJ-EHWt%2s*i1RDOx|(WRTWeWf zV^dmUTN?55mzkc;hofIyFFPXCMqaLzlqm-CN4TVsfo#bjo=h1pMJmjY33KGa92qBN zs56`>{v9a(fqlelP%km||M#Hy2laLY^&lx2N%6$-mk5RIf()%QsDpvb0w37vw>5gy zXMWDi`kaQYU0siito>m2JT&J7gT#wKsL2GJVan_GR`>)o5E;QaeH zBR#Ffqb|-k%KXGP=SvRJFT;zhNkz!VG$j$v4;b=4;&&Ye1p7%Z- zEui2%J^>Jvk^L??&ouMrlfbt}-e!DAAfrlKm65H=QT*%ds+ye0ZSM75{y_dA)@y^s zcj~+JqVFX{0}7&d1rceRz5ZQHzwSEwT0lb-*ZR)jZZQAR-559x!1ySr8#dRKPBj(w z^XuU;KTp#z#oS%9k1xFp8=@? zi}cPW%-G918%UJm;Ym4kSb|Y0rGv&BSF{iFewC3((5qJGv?&MJi*ip=*qOIC4&T;0 zazhU}zb9{=J$gy+#MRTsuABk*L*PGG&K|#V?kM1(>t}%ffc$^!^Mgm#XF0+y~KRCRooZMNI&W=l_$7Xi4lbcHgZDrR#KQVZAOaJN3 zV>bkKJ@A*_F~aREmb$|J{EN;NVM0fC+;*fJg+J=n_<57x173 z9KUn*_=9T@e}VZA^EZP05ApA(=Qln+zxA1@|98K=LH)mDvFie1_sP2;F1oQeoLUe@ z&GRWrM-oakpGkqGKd(EN*_hZ`olLJyrW3D~f}YNCNrRBpEMSY5CTF&E>ZKXcxMEtn zw6LL5%}vVYCx)jqb2}T-rRm)EYS;8|kIV>{G!Qwe~0eg$*4i-;s3GfG3 z03$mbg3az(y|;|^N+!$$*$tz@=5bN2u&;KQ)i@#I=s+|bZ|du@iu8EtW9gI`>YN(< zBi8qOl$URIWPEj2d{J_GPNHxSM$3!P1#H3wVsRWe&p4-NO2FP&LP(u=UsI7Obc2|8*Qc+@@OZb9waF8(L3`~y#F#@G1C7V}rP@}`z@L~@I;ln)lJ zBCcdkGfyp`X{VPqbn9y?&>I87T3uh+92YOBBy)>PYcn&tiOI!T<>Jod)-rp(Euy(E zr90QYxF>H&TBqSx2r_)K(gWj^{6RUNE9J3dY?h**CFika+F{c1LAl+D(#SsE_!DEoU9tR6*gm#Vj0h1H;=L)O^D zFD|90q_!ufwZ^2rr4=CR;%p6IRIBnWFwQ!EnBe9@d))KQzn2CeOz1ppI^z_Eu+Vy)6>YOF)LneV6Wg z#n(0-uF8hSZCT#L`ODVE!;WTR4y}=H-fcS(1S?XntkGIZ8o>1QE#{k^jLy znD7Dh0Q@ILeW3kV0dV>xARuD?M@D=P)&W8V7KE`M#lO1?+)g9{Be^)3-sD-IV@67P zl~`br{p(d&(8B<-V`Y;oh2luAwylM)GR3ut>e1Zb-O}jY+Kk`;?-r2ik?qpv1>fvW zJlUU8?9Nz06A!K*zk5~R z=-#DwMi*Z{y!iIf{}z9Uzdm99C-lGI|3m+E>)VU_mT#Uqe*PNmnb}84Y_H5_(OM^l z>*W2ug(=>JNm2F15e-F7c`@OQMFqUJLQZ=gyEUb~CWc%<=63O?lD1W7%KZ4^ z-019-a7?LOnpVzFE^e=muP)PsJwAD{9m6L1-JlVa40pzKRQpwtg6a#xn#*E3Y9R+Jm+kZncH7K0`c3!~b0rS7(cT|3i{m-4gKeaP|4j{#vk0kU0{7}OS`-}IWyA7q2?E>1tTjH zbMs^Kn$by>YJ7QhQ>)vVoz;zvFHTP{O^vT;XV$c;ovu^?CAw#NXl+ih)mSHTbj!H= z$?uL$#1pUN7hzdXf-?-=qW`t_F$j#mO)594X?xMaGVfP=4=;yFW`7CBa#fSA8Kp+= zoHCM%+Q}WoNtF|lai|PH3SHH%t;}oJ=hw!C^PG0c^t5(zMvEBKQQ7SJ#M%mPkr&s^ zO<<&&X3>*bgO#eGG6^M`8ffOzSyrpybEN$}a(1tZ!`2K8s0Vnv>i|c|;Y^Q+#(Mke zA`@Kizc#;km;5Vnjz2gxI5a-U8RfFoEY>IoZ~8SHHrj!P)30Ln5$gc6Thra8Y;O~h zYgxsGto%Y|RzX)6Zb+YX4~pLnn%?ACu=eo-E~umboqI*`~E(AMBlS8P=jXB>;7U22izeao}J zJPX7diUS#DoAtyApn>Yz*ns&T2{Q0}K*A$J#Qc%-*xHJyFTXa{PiC1_fs?+y-%a0a zv$O&WQu@c#^f#%P`N8?e{TEN}d!qhlze&Xk03uM{$F!VJsaYmTX(sWop|CLcUTBeB zWm{ThS%QOdtxb88GnwW>ZE>mZ@T0-}zs0)|(z%rP>Bxmd{l_|h*v&5gj(&t4d$wkq z=9c5%s&5;j0q~@Fayw)w)YiLEs+}sxUS%Dr&EALu`0ek1{`~vU z!NYs@@B8b(KYNZG+JV?ML4*fz>P zATzd(-z`|3X_527tFqHuD?>qg@-)@|aOe1=bEh6%ICNR>6!`x)3{C*~zj6)|;FH$~ zEdX`_z(GeYpVYf!aPH|9y@v)5te?Mh{`k!Py}^eY|31}!>hyMWXK89@v$%~c-=5^E zM1u<992Wk~m4!8+x~rq>OXhx#$8H)LJic}Gs{Y|i=MEd5K6vgVB*1$y{{y-|ee55- zW3Y5UVmm+^Fh2>x|HX3$uNdsx?E?Q-?+EapfAr4~WB;xk03Z*fUf2jA`$Ekp+#c{= zU+*ty!C?Ld!%w(FAQT=fBLl<)oI89A&Z4+4>;HS}@`?M`^&Z?XK=R9r2j^ejzl8e# z5#rxxH$T0&`O)|mApw34bBvqcjPF~$ero^mk?qG1K@LIHq`->wis9ZCj7UOe3Z3$+ zp{!tlULo$w=QC2e>eG6t*?ldAJVtI$QzgFxrspkhvm1Zb<@;1-{A#Q8sm}2w=cMDpi~pP5`|&=h zsZ_8vmdYS|79Y?dTa9^XU)87T!*~I&Q|K(|y900F8%LH$` zjL_i9#GfSzp`_^2s+@^&>E^}?4gny?%xfgduI2@aV0&dA&=BmFw{Qa%i!|-D)iDKB z1Do6Hu=Ctm*KN;@&ky#@i24bi>5UcWiZ|DFTRN?7adBFy9_r{;48db*N{7{AV{2(; zb766Pa$;#>YH@Z}J3R#zz^Ycg!^x7A1<>UkGsr3yi}$Bh>nPq}7vS`xBdE~=fD3hZt2!Ct<_12wf?Hn7E-GPW6|(ZG zM!Wct*50Loc?-Vt&yuH&@t~ zDM0b(_9t^`x*5=IsRqjN4?MPx7`pBP;OOJ{;jb3M+wEA z5EnyM+zhF&FRj_D0WRN3CMh8QBNP%ArX4VJ@R6ZcCA-Fn+#UowZs1xS zodM9eb#&n;4d|+OZ!GyyR%u^J0ixwfuCy{(IqW+s}K7~JP2I-|;WZFQ_?2c}JTPu-ECKjg`H*p!mM7A@& zw(OG-diufTqc;o>oQI}B|L7HiL+5b<)4{OF=njDW5&KAlyg>i8yB+)qwePM3Y~LlsMC$!{_Ba{=@Soij z0BFk26BmK21~C6QcIOI?zsP(!Z+!o}@x2SLA6|J6@ZabrhW}45Zo>%r%Zrba z?zSzF{R7=KGVvHn(Z0oIAcW0?@}HP$DnCOf&iHn=V?g-J-f1eSuiWe`D^=XAQU?STS$v1=>0S}`Tm zjmg#lr8~K0Uwi3u+dBAVaH?r?{;Q~zi}rp7R=$_)!mqf+o%c(7Olp2zGhj^aH)-ti z8W38RP>pSa9=x_UdWfGgSuqHQKixWp{{`LhjCNyuZDwGRk=H-ctCP8N&VyL4OJ_%R1KC=xb|M0j|2z?oJsXeO|wc$5st;rChdZ zh^yeRrL68z{=n>zNJ?p~42*Jo`sSCj8|wV{;LyY%5B&nge+*rK%~tobRV(qiO*;v!Gq($taF$UzYtL!Cv30(k8C~npwNr2B*44M{0{(GmgKA45s#Or{OGOz zbX)}5V6Ws!V+PXm%`>fzTe)5J!U>r4AuZ!gO7^>SV*WSD&U**^KP~rNO76SVocF1i z|MMXt{*)5_DB#N})2J8WprIlrvg~_Njcpm(uCmd&7UHjFID7ch8a*43jF#{&36;Fj zyBR{@4u7-&+<)oJAZF>0((JGKbs(t*b#?@Ib_M|X??Um%378SUpg2*=tjm!mT<1!z zbFM}Guk)(tNo|QR_dW3Y-oO9+3k0A)(FgYZ^Y@_xNQC_J*x#=#Uvnfwn7YL?@_Kfw zcVci@er#bUrEgN4*-)I-TBF(78rhr=FVFGGjBAndi~1UU)1y5ye?E8lWMF*t1eiZ} z459fV&b|cg|1=`Nkl1wsq3sv-&fGQxJM<{%N5(gf-Z*vj-Tm8U&u*GN*?04}!P{G1 zi+t|9)XdX5t|W707H;e-ORL(|t&Pcr=|PE5x3f8}oefG2J8yjD7;*$|TsV5o;Lyd> z2m%8I^uTWY|NHpiKaU^5*%vOIdkMsbaC_J_@I1E<5`f(~AB})efn7L@%1@MijQ6mH z(?9jc=@WmSgW-=pIG=x7e1CQS`x_&NPmdfv*`@u= z=%}k2?u%~8r2$PZEci5Bn-YA**|d(9sIFg5z`_-kioM6`g< zPi($CwflniPwYOJgxCd^rld2fk{DIYWfg0CBBQ6tt1uyp)g;}4;AxYomiQOPe~EDY zx?BIh$9X%XhuEiu*rkWsqy||h`v;Z8r&IH@D|2gWi$)bA+iS}^VEHf2j|o@{%Au{r z>20lUTe}Ra=#7;r-LztLRCeyy9w@@-QpdBAxQ3+Sd zO9ozli@##(^Vlc$V{+b?#KPx6$+w*%?>R@`aE>)_i!+SKxtK~hmr-j>?KEred7WB( z^OMu*YbF=Zy@_y5R1Rq{{{#GAp4F{P>ozs(v;9l$8GXD)$&^Z~Qp^o-)hgla;;>ej z%pObQlJ12!`_%QP@_Uka{Yjh}w?fCepK|@ehg;gD-Ceu&zfXk~01uz19^$L`d?lZw z;d4d@c{2jhG-ps!-i;O0vwI8RsQZb#fV!Wh>g!SVbxS&1 z#f&C#b3MDDj9XkY%@oFb_s;T6p6(sjw2qF{$YgaIDOn>YkBv7>wMMl&-gOmJ4k=p3 zcm+efY25x4$hDBkBIKqF3G&3Ee6gfNEXW@c77Ps+j)?Py6{QMAxk_3pQ&BYX3gvJy zhWue(zOXxs$1V_Z@%84Pqhbj&;zm2Fz};w2cipfBABMirn&?s6^N2?CD+(jRNKRUqr4}j8TEhv?|c6E z?e_!w5B#%l&tC^{0zP!$_<`U4{qv#OQ~sDlx3fJwBWF(tvfIn8qTO@4syVBg$coHg z)wyL{#;^L~JPs|oI`?NqmQ9>rU}4ht824*mpB}hz>io0or|%k`xnl_a|MAPGVg5ke ze{bl+2;$I%leh>Ry?Xla<&$Ub8Jv0u|D03$#@8;ryZJxo{yzKSN_uNCXL6V_&>ohT zSkzWMu3dz2E~K5KGZW*p)3eKqin(!8L*cD22m-r&;xPJNM^y*%|NEKa&~yC-B^TKH0EclUa)&6z@-3; zAf$llK>~)~NsRp$!THDMNCCqe&_Pcfx_RN~t;8dI>!=ji(K8P##D0PK1CYnq z6=fe(A2TDzuSURp!1Ld|^FFaNd-UV;BO8R>m_4=qV(egM1Qf{e+cSqRMxLfY70C^1 zR=t8#r{YyASif2;JWCSu`0YK5YX0Ix3A4>1EyN_m-u#!Rb%L)2@#^n{(7w9tTp_^85^jOTr$Rl1)y? zXBN<0=U3*ZmzHL=y2-5}@??T_b6dJ-ilZCjEvN_PMXb4)6vkE4u(RKS9z~>o%q)8z zp7y{u{=WOKTdpzs?ooRF2?zWV^y2ePS^Rf(j4QrzPi+HVy!ShG@JWnks&Z&lw+N$Y z-6Ck88tuA#b-HVg7T48R#vdPEP>js-*-ANYYJO;$pTe5V8Y;XKR_|Pn%Fm2v_s6lD ze5%~;eT(|$*jrX5qSM8l3@lYDP9GQZUX=-+kCuV)!SR zpG5KRgex*|@{WKGhA+J%fYIVbE4Ii_cpgJ~pHgX6P-|1Y92- zYO_mYvm3%9X%Jo!$Upv+Z%2!NN3%Dv5g=S1$-hXzY)1;PPixxSM5~jwF^{51Z&LF= zW@dv0`Z_K9Wpd6-)c>@C4;iG_$$9TnAPUHOn`n9FoBK`I{BPOi)<`-lK;k@XA1F@M zjc#PBb8QQ<6}%hEY)TSMk_)~UHF!0*!n48;&J_?Zw08J+QJm}2Oi5MFbpZeAK^^UZ zjCSk=e)OK;uAUGkIz_p4c{!pa9johHYOCzZYn>`!9@UfF9P!on;2-;b|LuSFr5Rq{*`^7)e^sRyavOuo6CIU<Cv&X>vyn6QZO~cbS z&L6*i_Rz)S$8MZH^#CnE|MtfRw?5rJ`Pks>+na&eVIVF{?JSMVs96&J%<2L>9+#Jw zCKjfllUdnb*Y51pvRZC@dISp4iMtm80qr%w@PBOY+2aHRboL~+fWJ@v3!?^%=!D77 z1&sYLc_3(Ns^rGMh^jSGN`{?li$1`fngx&dlt>Kk9uLEsf1^oCF;qocW$s*Ph#s6!hm-#Oriv%CjC{N2of5+6H zo~hv}71}ry@cJ=w=}L>UBKl@w=lIl zKefCvu_0`p`}K`h6ULin>87|^IdfXdTIlPXw(u|0GYNPUkYJWmVv?Nm*f0LR*RPwN zzs`F^>3K!{?%=1NnEAMhaw$6FvRjmSNQ%j~pcDJY~5qv6dehG)4<*+}o$6nlXk&zvY2DR~fGZJE!BXEURF`+u?8{Obar*!sWu z#>mMZX>T8<(}^nph(O?iayg0t)c@TrfH$BT;3?Q_6`MWIAH*|>R~~na%hj-VXa0U% zeu4b6RBYfsECpHsuE3n0T}42fpsrq2Q?F_1`}NJq=cVH)O|EEBi>XR^{ivuG%CE7} z#u;_vRI+)tSq5P!LfA#jnusLx<9L)dm0)Db+2&TB1qBKmg32#Aifx)%rKqg|sj;c>LlKVX2ItBN@z>ii+ez*%D5YpewQ;PX1tW5>O9e z>_BAQ?$UeyyYM0skr?&S0ssUNP2qos|J_{x!#~7d(0mc~zjGHSC+Z~XKh2{Fm)|&} zD3VEPnR!l~eR1SHZ?CKNHFiZ!a88DEjyVv{pgH92EH53y{QwRkY`i$vv9k!j>#_)aqZ1|otkc(ob@s#=T%zXtCZ|l$)q<) zq&IMlNQ-?M@?Gy+#M6*cYXbZ)vnZ;xE=A5S#i@$ofCB^t#h>a*N&A$Z^dYsvzN*Ey zwbi!;e+`B&qr<18-G@&4mX~8$R1X=QUpxM8Z2|4{0Q^nby8?+701~zmtI|qHtsSZm zLsR~vq}Hjt-n+azsqv?&7v}%pfBOxI@cRz#g9PC3gZmH!_V@9iUzX@m{L8y2jyB87;kN`-W`2qB4k}4$QwSnTlJ8i&G<(=K}WzkfK)FixriWu^QXb#0So9q zY7kZcly|HK#CCu)F_Z$}3*ikmi1YA#hDRJ^%lL-4DHF444Djj0N ze$AsOC8DL&4Ne->Sx)7t?p34!YJTQm8+BaNGBupWAXf~~`=-PLvnu|md`5>mp>}zF zZC=go z0s<^zd;kH(wN$iDOS+dwv)HX!109j=$crwF?x?F76|vT5c^ixMN`Z4$;>!R#WPW}6 z>GH<=$4hVI{C+idgWA^u13$Ka=P>z%;Mc+Ysg3EAAEtQ4^U(6cQ=2a@;RWGjcGdK$ zXHFy=kjdsaRl&>Uw3o~KIXerT%gO?7dl9EKudg|vF!^$KB3-SL{BQ;M z8sTmkAMgYCPg2mXmtEkGXg_dVNz@_=t(wJREKI0&Q1BP$rZ~(odaZ6sLR@>{=di9r zB+T~W=<2j&bxsLEFL0qP!2XDJSzRI)hm~2~B)p~&J2}3w3LhRq3r6@ttZ3Dop*m94 zgkWM5FzCE?c@~bHI^E=^vSTIIf|hC1u4-PK=B&#ZGeY{LpnJBqPV&w==80vPS!DXB z*sPafsgL{oR@tk@Q_z(Uc zUD0Tlq`GzC`V?)Z5tP5^&Pg@`9_IO73TfxqBy)}(+cR4tuX>qS{5gvq-^Yw%_Czu1 zfeq0w-CQ4ksQZ<~qtpv&t@2)`s=r@}Qa`{`@p%fo^0?}OfziQ1HFrS6<7!azQTcHo z#^>CA{AM+Kck*Z9l|X*L0#)|+0tJF1K;GS<=;|1vG);D}IE9rzZoVk;&r!gauxvzJ ztCWy6BV@I-ZcJ7;KGr^46Wsho&nnlU2%gWq>106Hq^hox~vkT>#W~;sMD2Ukf1WKkmE)3=YB%zJ!^dsQ*D7z{wd9e_>Si z1OCH+`Z(W|lz?~_GZNew>YYlm-^aRKvM#YAwRqJx!UYH?0H^w9r$$7*1MLCq(}FI5 zH`oIF7|p(P+y#j51}Om&!Mtg3gl=#phdc~&x#$KL)9kl|1T6DqYWAy?+}9~2_?iL; zdY_u{GS1_IqvutZ9Mg1^{YtBn(r-llud*qxbE>X)tZnh20{?*v=&zT*5Pu2TFAZ_S z=s~#r;=GHTAcwl7Pnl(oRgHdaz@xC6z!wNV6z&n7=mNfUvLm4jsIjkx{~H-BQ0uZf zm&zvJs;>C@02Al^fA0P3k3aVA-S^jCfdBjcIkcZp0h~Vc*XaX40vtO=ddt}jMeMq; z+Vo6bjZa0~_Y`-FWY17)M!BeyHaFl|o@VTC^Y*8G5vNVGGEL!kKeBzl@A9!TkBEr& z({~X2s89I6!2X6e5?S6437VM@g#hK4B_E+_x!)t^lqBmd*}AW@YVHwH;%t_ zFd3Q{2GC?9<@$UPqyClWw=+*~oPB%)H6P*c`_3N4 zB5?5hsY3>Od-MqWhe&lK(i=~M1%$dyP01IB*Tc3?Zec~IwfI|9Iey+6)? z@Q)7(wkKirhVy|T;s1bFU_KCk?Y~0Ye+m9SL}XX>kKD$k`|6<^hR5z+F?{vV;N`vZ zukT%YOB8?1|9Gx_1pZ@m%gh+e|9gc0+iQS7c<$M}^D2mosLOFHN{sKQ&EPeARHWM# z#r$k5jqI#(C`)mv%%f;*}wIG$<`XN5pxgxVv$*+_TbuEl_Oeta;t6qmVyujJl$L5Xa zj~5;Yc{G3F`u(}nH()_e2=E6~|F5Y0kFCF;@*ANAVE(r;eQxvRneCS+HXrX=ypE{M z5Nu3!&WN&l8%tp^v;fbrf$||{t+1zaOsv|`wkY|I8KG|j?LUXRnMJyr$9kGZxZ*Eq zfi9L30?!Jogh0piFk2W|$N7a9Cl$9=R5g@!(d!q+<=eWMowbFvak)-CysDONPmk~D zkQV?WxD~=)O*g;3Fs4(BmlZ>63u9ZGE65N7^0PiOJ}vB<6tV#X5#nN4v%#Sm_u|#n zae=Hgi>hWx*JpL0W$I>D*C)3XjHOuXMt`IKpQ*3@YI9w;{S)pF_nfoO*?U>t9Vw;m zhP4Gsh2pNk-QC??6M`loB*95Y2*KT5N}({;|dV|?QqY0B#A8e{MIKJR>{ z6m=C&ZVv3PbbJ}CU+S)1>229SG=z>x+zaEN7tRst{&CL(5+C_S-|~r6^a_{vi&P9v zko5_>9TcydlRqC> zq65>5HC}{%mf@b1eh@z0$$fq4LjxG~Q-=qW1_#mxx)Zy*Q@Xp7I|VU9jyESoFC*|} zRE`r}l07g&pB=`)Uog>^KStiUqn)Y!!YBm0q1GJ9X3}g=sm}9Pj308JS0{RK@yf~EjLBhC)&g0TqjK}TD2qgMke8k>C@Py{CM zZREHzU2Zyh-ge6&wy(^Lmr0qL$vIjnS?Wnyn#okX>}aJxi}S__8c`Kc{+Jb(n4vF> z&aj3RjwCEn=RalqP%%LV?F(_5l4$LykQZ`5}zsi3vf_4}Wg z{|_EJ{M(T~51l@C^xVl~GAIA*%%L|Fy@J~Ef;I-E_~ERKf}!fzR;qRs#WpLzyE5K5 z%EL0%*Cff$yCm729`9TjE%`7bTo^G4bd*!RCaZMq__g!rZpoa#EvNAKrW|VDZ_3Er zRlo?PeeA zK8*^#o!O|W)WX)X&gG%mpPvP5BRU~=N8m4eaP_F-`6CMF!2gphIQet%0vv_0SMDPC ze<|}rvf8k~#aTeu9lN*A0UrWAIhIUWzWM1@Vnf3!WZEmA)F6_ zpiu!P2el8(ztH>>PcgzjZ!4a4nH6NL3f&YJGrlmq6fZn|Gwe~Jf^eRa>4OI)fl-P!q( zLRNy99b8uu#w$q{Fxb;w&GQ4*J$&)>@ap%?-zdrhN~A=7RjQEX$IMIV z;KjGHUCJ|^%QD03DoUoh>63j8%agsk>#T`Bok%woXXBTi);hlSFWoJlI~x<(r<19& zje(Mlo+@quHb&2Fj5O@bG;B>(E%lz7zE!o>)3h_vax_)5(#0YmygVbVw%jo%+=G_r z&&+1b^|Ws;c79n9f1Icuk+iQ&RSt^G6McaHuoxSKyPC#&8iYCN1Uni=xf@1%8pe3y zw6f0%hkwm7$0O!B8hVp>r0pa(}RisGZP}s-MLy^A=_t)0O@WL3U zV{>}_EA*eMJD+EFh8h-=ow#1la&j%phbkvFyT6P#Er}}^dh6FZILpk!UL&)(2XA~I z82deP3cBMMbjvI3qO0#2w*Wc+@F&qJI+=xzg_XAc35w^R+v<3Y_ss2l++Tmc`EeGz z=j~7ZJ6oM!r|Huyn<}0cM()*>{*8ggiHU}}`PxNEglMU7vf^Dv*gZcJHxh1So z5XMQ@53sqXN%amC6_@n0Yrq1{h}&m@|Gk+1aRh+*>6`2An+FBdL(YP^o*q2&-Q9rw z*{)7l20#h{|KS%V6cD}v1=JzI5ilbbk2k{z*1Fy`6m4o}_e6WJTu|gxxLCJ{NVk#7 zc>?~G%hT2GNAVepfZF#XC6n>mDGoP03#^KTk*%H4?ae{_=1_i1q)-qgZi^NRBZR2> z<@)ie+?gr*>HaDq4!7O>)xx>qje|58z7~dxXNc7|Z>+CitS5W8J-G)aFGTl9@xP-j zNFpY*4=5l)@<@+>|E7I@odUpoY5D;ng2jcrvmg~@Z~)*=YPt*$|eu`SZ0 z1YtW(K7uBn7Nl-s>x!`)M*vz{uu!gZqdxB z1>tus)o)q8&G(E#x!ILme+ED_(qb zS^nvD+53tzcNOIyUIYJs>5lxxTbD8XLj@`eQ@|a(aW%Li3#RCig2MCLH(%eE*SdY- z#Z?t2ExR<2C`NMSNMjT?_m#hCY;B=yZm31NcM89#w3k~qD=w6+(fB z_$62%Xn`OBIv{@u_X4=U&<+Ou52^hkOJoxMi6a1pUvNQ(rL+?G|1%)}mG6T5zpD9I zUgOc#*H5p#RlcsRd_!CLrjF`u?0+EvGSYZx`V#n$`CrNEwUX64El)GQlGFr#xeqJH zftF}XjWf-Sq|lSxSXq>kWV_Pjpytwo$&SqKhEN_A`(OGXzgS$?yEZ$s^%032@HIi5 zyRh|fXk}sg3-aH-PJCW&8SSA<>OJz~%;SB~*Gx$bCge{%1V4YjA^tRr^0L74H_p#E z%F`^?3qOfQ0P|!&i?krqv_OlD(14o4$mU9qs@(9Vil`P=R4Y5Gg)_BzLsX66P4UjktSqBH_=num@OYCE60TX^mO0iq|mAyiv({?Zwtc+SI|D% z0Tlf(C;f29fjmuPym1jQ$A3{$plwE|LvFZ3Zln)2DT$qzS)N0$%pd9D!{>#8ANG;e zuGU!&?el=>C*qN?E&uj)Z}01ODEJr0zRdURuTTHjT1Vj8cQgoWZ+zeV^mAw9+voTA zf$w{p-}b-k?R?tVfvIBqJ34^hfBHD~e*fbRPK?c!&)chD=|3&^eVA{anW!CKlq`-k zOt4ZrTT7>V*&l|RH)`l(4ju*1EW>XZc_>=A-f;E3;_fHs6>uvwLMtiLG&RR2GE?iV zoziWclFXW==}((0UzaA=mxe!n?Ek#pz4fVeW2|7T(z3k9g}vPP;bZ@&Uf$RkcY2C7 zFANdP=8VwaW%^$AY!7P@gf=z?b6dizvy4M5?rIc!1&9iZdzmble5YI6W+j~j@cVja zf5AQgpIiaRSwKGY^#cDFa0K8Y(A^FE2MZ+S|3LwD&UZ?%|DBVxkMjA`Lh+ZuVP0(3 zi<4JtqH^Y|dsFpN=W7-x8S{gsv!i8;WAufos-+p`@)WrXEFk=0s%)mrxjaHW#`j)e z$kVW-x5-Iw6LL&5vy9TxbdzE=qk~j~Jnnfo-F0<*;1;cySmwd#%Icq}SQssz9V(vc z%N`rZ9|!(-WekcFdiarIeuxO|Eu_#kq@yjk10Vjze{uv!!T;B^FMX5Y|9|HHUz5M| z2$14GI3I%lWCh@lM*ym%*}s`-&xqHIiGLAYZC_SxS4ua`VOmigu9=6b_%(Ufux%=V z|6E57$Bx5w=GM8_;R*nnh3t|2kRXH*POMzPy0kPy2ny`=Z9%MDgG+6bdtHlX9U9(E zFIc2##OI>L_(ftmdE#LNNO~4wCvTOg9$9HctF|qzw4~BZ3#)8O88+oi+cGvN9ZxnC zJ8`e#ENeBM39H6-^ZVG192GI>~X#DH{{^QVrgGWysKXB~OpT`dZ{|}rv za`5cY-!B|dHPPfwi0BedBr_*NSYe&yueB_Cqz8ZiItPZlHRAc=7gS!u*5wzjoo2;`wto;RS#ZKt}fA zWyHi?dvOO_fa{uf6*O+11c-X+7)DYa+G=Ts+UP~Of^pJ~aef_QW1AnGJ6dg(8K4{G z?3^F17wvdO`{~7}H?jOZc~#~#NdYAlFbIE!5a`cyr@`>RsD;fhX>}n9{}+FkIs513 z3-}VVJ?;X)e1!bt%im%K#Q%$(^63XR zPTjo<=I7MCtMV%Mq5M}+e<<_f-j!ER6mbM#1%M*}R{%XV?0@eWsXsK;d}0Cp&r4;S z*UC29THfXn?EI8AM!cvhT3G2(k#3zIjVnNKJuSG77R9fM6)_XLcm>048SUJXK|y7| zkSeV0Seh7HUtUJp;rH#?uOHi{2KkeHlBKbU-LDIZy@;-iWMW!v7|0FO!VEg?M z`+y?=JU`wRF@EOJJ{D0vmeD?t09nTS0sm3sZl2_466cK|IMejt(7KYy#)^#227p=N zm?Wr~5!}c~?`|pR7sl3CnWqIQy8^^5U%Dd6%@BD$FYJxf>YhHCbPYEb^e|0TTw zs95R&|JAJZv>^MjHqf9LXxbT=1Uk561)D^>#nzS7&Gj-SMV{p;ewCRJ9c8w$!)prN za$_lJp@z|Jx*?7_0S@{hPN0AcBi(dEoejg>P@0A-4E|dXUSyWwYmI=2f*8lVC|_z) zRC!iDhsI!+e3%^p;Sblyx3%}1Lmj(|L%1z{|GM@K$#0)N?4inW7eoHqkImJcrO6Lt zo!c7=Ac9aBiQ3>FTWed(U;@V$Smx*ZMwnu!aVh zV7g#FB9g<=f}%tNAS?V)y$2R&QFvr%rM^%m&}gPr{}o~OW^h3 zC-mVUb|6(JBTOwKKqbWciGQFGt>djC$_UST+$rWhTI+)y9oZH&we?0em17 z5E=dv`vA_L5Aq+l9njhWlN2_>kZ$^sQkAIZ5h+>;9LGwOHkKIXAd&E1| zv8fit5ii21mPH7ou5;(2n4rO%hrl|Ke@m4mJ@I7{-L{-ql06CX6AlVj5AUXC-zNM_ zy;lRK{X(NcP(TbyCC!9djYYP7WuUcGqk8XIGZ@gpx9 z1UF}US0+c*moUcL?XyGAy|{bgj{Hdw_3{@^5dHtTL$U~eJ9iw6y&Re0G4m6_KSug1 zMA!pKr_|Dgw z{QKDArLy&F70Npe4-@~2jM&DKu)1RJ>MXmWXq|X3>w?GtZb9ClfHon?>S^!?3)Da_ z9u($@IYA}qS@l(d$-ap%A0|F6_byC!E=>yN1_evQ?9p}>Y+~I_qSbNMczbX~mJN_U zIRF*Ilq3@SM({r|0Gy8nD4-ZW%V?~F{Q>?K@ji&5FpBcDNeQw`54A`Ma4AlR<5&5y z@&mcFgmzwRTWzR-ojD|;PIMvJC6!;J8Aws~FxB$4(Qq?Yp%`G{OE$lR{5Mv^K|mpf zFU|;{(~MVT8LC4!HDS$d)Ks z;U3h4kc#y5+LF8)T5WCR$LZ0ZTWjBTH}*b5GVmTZg1t}6ThoIdy99gdvp>Flh7sV~ z_Lt9dLo=Pc?Ty)=KadEA_L$x8J0HJqzW*}Y`(?IkZ+8``5u|Ydx=`XBgF65X1Ee7U zOJzhy6T=v4i6I#M26Nf|&z+z9E8i!%vqfI4BlSudlLUq&Vy z#U3c$0F^zSJw8sGo1ia@P-ljVrbdfrM~Y`gX|p&5 zu)0Nb!wh?FfwMfzT3o1pKT|qCUNA9UFa@3G7{Z>-^C%fHWSAamG^CT)z z!v6s9NdUs%%n$G%j}-sO@;5*L@*jgbD4>?W7VvCErp19z1G06&{4**nXo%%!+0ec3 zJ9^%AsdHs=?5nFO46K0J6b{FMTkqb0`glSg`SKycM3rQ-Hy=|sL4HI-_%s4|F@d*u zHP<2<44Y&JR)=I0XSa~>Ci777+-+Hs{6OY^@IUew zZpxm&DRcgY?D;#g7w^df_F)saa8FL=fx-=qJEtGYoO&#GLH*jhP)pyE2-*OPHpF}4 z@and)s&$%=Nv5Ysrms=5Pvb}E4!Z5L!{xM|{3dt$G-&xN;CwE?0*vHOsDLp4AC|oU zKA$*$Apyd`PYk@$BnJriiHx7ffuw;Cve0%y4)lxvA!>iHKsQkVj5wgP(wZ>*m<(wO zga7O1WpMr{Z(YR?;Fl-B1>L)P;pv?lS}HeQsa$>aRPi;y|0(o8x3pDm>#E*`^3&kO z0|WTKG#;5~0{kCaK>z)SWp?m_Sou-S<#9q*-f(NiKua{g z3T<5IWUN~rMg>ePvoMd(>RFvx`nf%|x6Yp)DwQu)OQZEji~W=={% zDzoj<(DM>xmlgv2N8lTo^W%KYl`M6iT4<|S>OQy8SFzB2K`~IXe5Yk^tm|p5?QR~$N~@j_ER(RFZ%uPU zr9;BF26~d9${{DhJvTa`p6-wpuIX#}F33(l*vTNs5o;zqhEZ+?5w7NtDv`B?7kD8o zukF%9@V^0vtO##%RE=e^C<-S?B9h6P(o zqd)LVQtq<3zw>@;Wo-Y;dnkpzBkK)z;BTAXf#Xn-_B3vCbomS0KP^^4Ed8tjXPWeyL&Jh|NQiQXL_%-us7YcBH62gn$uKPDM~A=52scI z7gPjhlsI}M7`<^1bck)|b-kbXyfXV~YU0D})Y??<`%%&IO2_(o+r~oWT#J7l-8c`$ zh@;Gjh4%M#1%l=Rp)gm%^Q#+(>4nT?g8%=01W55;dIcc+-&wJEnlD=G z9~!M~Hhb{&*6*iN%)Lg68wb<)=p{kN)@auBM8Vuh!8FAALxt1B1v7(%lYRN9dY>Go z!KgbnLY)}JSx_=PTQ)yaI=fi8v`{`j57;l6nWoQ7(xsS>fj@7gD{Dxc+SifUCrauT zr*yZ+b_&A982j-c!wq3>;xKUj?Wi?DvOOs`#9J!$2jCO_hw%Ia^Z#D*!r?{m|Gyup z;S2bWFTwms=YMhqKrjMX{sy$vdUCUMGlP|asU`(A4g~*84D#4EWv;hveeV5@|4ggO z8hciaEgMnQ*uAzu?Fr$iFS=k_i4I@70w7laSOD-~{`YRI_o%P)sAJhO8(q1O@q65M zGrnY&{xUvGGci*u-v7S4oq}zFadw4O3A*5Eh6R<@bbLnsKPq7G^IT_UrhZ!Zi-;0y zDi*)1d4@y}yNj~_X4;^3*ne;q%3;KWf#Ko6We za$NrO$t!2|U5&~+sH|MX%pk&RTSY*i+ST`_Si}* zkz0^0C|9Mtx}&S4pne;kU-Sr&@c%pV=Wol(-X}ZXOSk2T9SkYZ*Drwox%2>~@bZX> zzM*#KiW-RYD+lkKJ@)j%BZ_9xQ0>^yRpVHfhbF4dIe{}j*F^i1Aeua=i7jiBNJuu1 z@{-ehaPZ2RQ@8?v|G6rQH^?94KO_I=zy+fJ1e1RZd)r%Ah}!?sS;%`Zy@S$6DGZ|C zi1PmmDSUw<=y#d(zOp$@C*525W_!+3cU$AyXQKlDDpqE5QBh zGAii&RYL58!plcj-#jJwkKtci<*uIEeM9vJhA$o(zPN7y36T0Db6CJMl`UVX*uGVD z(zQtSbEhSS*VD5Hni08>&{7#vlV30_NN%rjDogR_6-L(6GbG%i!RFGz)|zoi!xW^A z6CLj-89jok!B$#V3wWVCc!ay^se>&@kYi1B6!$jymZn*!1R~f0ED*xqEED`OGeh$O z<^-G%z~4NEc)svGeg@$`rt#iJ(Vk}U-j3N3p7c~OJhu6Y%`q~YiECdBcXhlQr6rB09|B&;u-jGsa6NijsuzpAZ)s;$0~l^&wr9-6)e{;OH* zKC{tRGJmUXt^W?`5VpGdzBbgZnyH^_LmP_&>&tZ$z2eVvWy5^$(&ShEHeuyC4YPwe zqH5hR``12JMq$ndA(e2H^YeUzV07ti6pzq(kiO!7o7E!5I6c!~Pzkp+C*6ZZ53DbhrBj ztzA3&(l>ep_O^DvZSMbE{Q=!hO=3%!Wh&)ufSYZsw_CEiOT4ME&pQo=DA)APhQ7JM z4^sp02Ycp62bPBVmImABhxiNgg5~9g<$2mftxIKvSw6?Rdbo0IPO!jBZ>UYHZ%z@^ z`SN+;Xjl4BSJrS>`XHztNorpk9BoNmtuYcoM7toYT^Qbh;a?br$zR+S zN?>0U($D7Rz0YXjB`Z{M0$DZBfUYlo-{py%@xN2a|yOd=0X!jeA zJ`cQTmW60NDAvm>Hpnlxq*mF`k^hh6H=Z*S$rvH3p(*cD5!%z}!L4&;SKC*j0uq(P zHIA&P7t!z;ay@F1L0XRojsRdj;!ME;;p#y+s0QRk6k8NmQp&3+6*MzyHKnTFm0fO8 zSnti?N3k5$On?8sza9AFFQoq;I)3!fnPUe|96NOC_@NV!fF3^~fA-LYBbt`4Im3)WLuSx_DC#r+~~|fWN|N5)*g%+OykNp5K;Nzjn_| z<c7JD<4tCnXCf+%{DM!39T(jJf-&vF0!L|5wR**Y+LlKf5AV2)S|GID*Q~kd#o&608pG)Wdb^Z+I ze9%51`H2Jw@osV#u@S&8$tiH{GBSUpzTnFzQ6EXdg5(hUfXN^FPrL#CB>DO2o$D`^ zWmWIVy|{l(Tj|Qn$Jbs%0;+UZN9}?Bi-!g;9vP}XGE#qF^x_f8e|xE7_2#*~&NF9y z-?EexA;Tmoz@t1PySpy0w<)r&B&i+y)(YFA=!CZFnx(;-x&9OZGqtI*K+GH3UzMy( zu?9rxO^h^zLh!2!`uO^F7ST4*Eb#Y(3pBBNQwOI3LXUzwjTjAM&77 zCCUr>ACqV=N=6w!NWRO zE5t>^$6n3T`h}OxD<7Me9;C_fIpKT^RKWRw|Hl@<+Ca%dSH(g{$>NvpKFpx;~awgUvl#^XiSJEZ_KA z=>;KWj)MKKPOyUsc&cc3lUQ%#Xip>jB_Uyo!==X03LfXQaQlofizI*df~1(*vZ(U> zz??)HqiAJu9IQTgo~`A%ozE+f^z41x1~0TaC|vFr{rLJ3IFIrEJA4y^9jm>KKljkd zxP?TZ-S0r~-MxpJ<_+TK~{FyMb7?nT_40t?i|+ zyDQuKYsll+L3Ys2$FKVz_jl*Nt@M57=C>uf7q}RN+Uo@Q*~HLOS<^kU?`J>H53P>( zzaJl4pBP#j>R22WEezDnPS?$^*1exhAEX=PvaG4~{@jtW(Fx8ZHX9w zOWp+k`(}H{6@VbWl>dP#j65BL{~_}~7QtP>|Mp3-2>PE-gQKFnVvREjhL;|7WtI=+ z^4p`^ntWU9-CDb&;pZYz{G^j5XS_FeyeD_8JA0%rZ@eG)UqIHl{n?{~K>N(mfvoYq z)SkKc0S5^vF#1(5QU0`VG#V| z769=N-T;4m5aAKw4ThgQQf^4z|W{ zjS>9!ZEf{Ih@5l<3>O$uAbc8Yy&G@})OjPchsSg0R#=tS!am?$<9f^0{Gvr3#GLA} z9ygt1)FWx;g*1bLBAr~SQGSIbt-_kduqov@RNxkn_$n?$Erf1c0s|K&e|Qk;+-jgK z75LO=>86K0k1C~9)Oj`H2;jQ$>b$W6Af!_*sV8e{z!~ApDm2M2MVd6Fs?>s3W=gAr zk-qc-?-|_ zs9m}8^5&(d5Oyk{0t`Gq)czM?2O#*b02b){bs1a)WbficxD4_K9$^Kg>jxB1$f;lT zDUQe%mpWwlTr*L$(U&iFUw{O3uEev@0n>Hym|iU z^^2!($Q`?K0V+_qz)mU3o>G)KB6EQxe_m5Kip{Sqj9oInUp({2rE`!20pt&$i$(& z03iOns`2#li$~c1Li}@;=>MPIe5-u>oyuL^XZQ5f?&&{!XsrIoL<9K$*i7Sv-8;tps2xPn;C*EQ2l5RN?xQtufV-3Gf`ZV-Oo?!Zt`H{ znxuz$RAgEt2fy^UedSNl^svx!wR{ErKN`NQ^`BbmC}Y(Np2r$)FFj>*9UK8*{*}zN zmCUr2E#5w})Oqb}iVzIrVEcmh>fWuniJzYrer_%8Z@>S!4@QeID$Z`>jPHKzUY>SN zi+JU0r61yG7UixVv=xp6b3|Jwg?bbupzPi$ zE84##E0S3dS(TT>$PsooY;Df}-2Sk?GWBy4C$Z08mp2xA))$6<>|hZ9o#!U> zpZM|zY+?w~_`JIP={?rEh?4&KX&wLU&Sxls5E((3e~>@lclLg6?fqQdS#F#duIO6k zPk-rK-5&e2H}iF8W_x#WXM1Jm^Wv8;%U?Gawsw|xw->*!4t<$yTk7Br^)-zz4S!gh z-B_IbI6uBRHM}}H@P0rt-^-sJZk+39j?Z)FmspFfo{br*agFZP%|Q(#wBcd;5GR1m z3#e`kTFqt2lQhfh4v?lxV{XwGqp8@k*Mcmedk4iR|qd7TR@{q&>9K}5YjuL z>cI*C{7-M+0&#wkha3UGe<=$@D4_1{|H1!XN5Bl0zrg>FcKFD~h5V0LAAsk0sq^xv zT$NYkWN}MJ0`R%L&b6t@r@cEGdj5%ljEVlNacDKWb4I$eLF12hXAJjd5BFpZcc%|_ zXCS9;5C*R9l);|VAp`;8-IY2ZN$hP0^2c-uB02?O9Z+~Shv0$QM+}oM3GfdUw}v9j zzfBZ|D}cBSZ}Pq9?+2$q5DtQ0`2RQOkJ+9ee-Q2h`0(pEAej&UJNyUZ3Lr#DE>^%z z-YrdD4OH`jAmzYZ{VdG(TndAxm&dWIsIV-wkT*`!j1czz2Sr+DSCC0xWt!{*;+e5&I1AXIPhV>=*@lS)nSyxrSM6XBI2~JQr4tJ$NJz z-=~pnR~h~+3U&#$JIu&UJkQ!1H*Ou44hSaltOx$X9aigIS7uw5W0Xq=+i%OD85dVs zmN&T8Kw`vpEE7f5CYl7uA3pn^|Nfr`4<441{|A3Re&EmJM}Yi@fWSd;`24Yhn5LDl zUR1ey*I3n;8m;ARYLn`h)lxpaySnjnCow-WwkW%PpuJ&S(z!KPHOMy&qL@WH7>8Kj z)_W}f{Mv;_@;B7)Dk|TA+6UwhpdM>qC_klJ0J+N#ugMT$~p6C(7El3wtyz;R)aUZgL zSyBNnf9|Nl`D60uPb$ceENIyaf61Y@SM~_$Zj$65btL~NUDE>cs}S&it9(aW`40SFI;xm^pO|YsF~jo`0!ZM$vhAA(Rh4Er0r7+eYJ8Hx23s<_YBM`(QiaT-frdzSzFkI$X##|uB>WlWkKoK9_>{T; z2>)*>eaxc0Oro$?b%V6hG|q>T6>6H~?^qDyK#dD&pvJW^k|f-a`ZAN8C|g>*Sw>JG zJKw)5S3Au4iG$Hgn7>@ipGk**DeZ%uuRd5HHERP^3w>2fT|CdM^i?f%lr7$=SZHh7 zn`k*2Ke2ji7UM?d|LwV^rJ?SxOI>U86JOWit)jQr)=&1%|NPp%GWpiW_PK|NVYst# zgsV=VgI=hkZjgf!w4gB_*j8ins~7HKKvbZ%-{!($MO{(CYNy`rd>i>U?k#cF~WaZ5dpf^+gl%-W-4wYIA(r{D7;+~hHWq5e1xH7 z_{Tx;H~E9l1oO!iKo~3(1qpv$1PHaCJ$4mT!whpd!(82Dk$)Y>wyMUus@9Ipwq>GbtJalE z=6@Im{9As7Fra}K_}`2m2!JrmUucKHEx-#+0Sz2?F58*SvST&4qvMzt{5Zf;&MHYg zI^t<)u1;F9F`4`^oYRd!I+buJ6)fAzN~@As^@!xx36-|xByqwO_|I;1)d#0 zZ&DzvEuoa*aH;jEul1-y94Nx55%OQ_S%-S!2A>9&3%kI)pxCOooKjwHRaRn5!(OA& zm0fC*-w?=dh+tYO>-_$2|NQM=e;g&s|6{)&`SZ7oEl;|FUl#Q|4|Oi&*jIk0LVcCdg+#&%Nz-4pxQmgzoTW$_kizLCvEK2<5UIYGV^iEsRD zPCrpRc~=gCACmm602R>1)5QOK8ZBU?y5+Jg=6@pQk-dNi-;jhK8N%uukh>&pej#WN zb_kiDFn;4T{DIdMP9ilFrvQXNQZ1-7|MLn0f6hEW^21de0q2!(pMQEAIcU++2cKe7K+GJmaX`9=xie{(H0>o-rWU#U9k1~W2}gq42m z9KU*MU^CT*p6J3#4-=M!w$Q`*^s<>Q_R0`)_-(VpVryw-JxwKT-0D6-=jwE6cN4X* zq37F&+Qos2X>s{gxtO>IB*2BJkSJ zS})iUkAA4LewYhXKsd1ULS0B45QISFF5_#T66TN|?vbD1N6&D|iL=j%iK?ZAF$yDc zlM1sF=fut1V;zf<`fr;HXpPy2TnEK5U%#wRbbg-i`@X$~f|&h%lK+Di#&1Xs{r2Vi z-sjEH!4-Dy*4z-T4BxNgO>~?SNjegyq--DTJx%cBBXR41mHpO3FAN{;OzV&`^eWClqOxN;M&*BLFkJL6Z z*fQ0}8yjGZ&TwaDD(7mP%Ytuv6}j{e*)xB63agSuWM& za^Y6X^Qb2jkUKdAF!tjJ;J9(A7PMTW+!AYA36{&I)KXI#$AN)N=_+fQAhx#1E91@u z#sB#C|M=sNKMowh+V{}!hyVQZ_+JN49D)Vxk7EZ9pE-8$%#r^*`P)N1l{9XlYl`1h zoyQukMrq9@#=&-WA)f5ErlG}|QFLSf-0NN#cL;J%tuC7UxyJ5qwuyAPW$^ge-3u~G z3JCc}1*Gf)g)`Xp-ne-F#>ETQF9HAMAD|8lOJSL#il;8#lfxC@-0cge@5|hHd+)jZ ztLM&oTHYoa9)>n4UICTy4=5V9te)${I_V|4-J!fPPxDP_uMA|S+2@7cv(!5A7�w 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

i9yAMX6{a%4@y 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%0D$cs+ird*gdG2 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

nb{b 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%0AGOrzJxr=Tln< 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

^B#czx~+w?|&-z^wwu= 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 literal 0 HcmV?d00001 diff --git a/samples/cpp/stable_diffusion/imwrite.cpp b/samples/cpp/text2image/imwrite.cpp similarity index 100% rename from samples/cpp/stable_diffusion/imwrite.cpp rename to samples/cpp/text2image/imwrite.cpp diff --git a/samples/cpp/stable_diffusion/imwrite.hpp b/samples/cpp/text2image/imwrite.hpp similarity index 100% rename from samples/cpp/stable_diffusion/imwrite.hpp rename to samples/cpp/text2image/imwrite.hpp diff --git a/samples/cpp/text2image/lora.bmp b/samples/cpp/text2image/lora.bmp new file mode 100644 index 0000000000000000000000000000000000000000..62859e4bdd531a784d81d6dc0ed88b8a20c4812f GIT binary patch literal 1376310 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

kP?g8UJ%Zjgi`y=YRHERIh^ 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

  • ctR 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

    Q0x(Vm%a*$#d&+;;A^qY8Gsd$3D_ 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 3 && (argc - 3) % 2 == 0, "Usage: ", argv[0], " '' [ ...]]"); + + const std::string models_path = argv[1], prompt = argv[2]; + const std::string device = "CPU"; // GPU, NPU can be used as well + + ov::genai::AdapterConfig adapter_config; + // Multiple LoRA adapters applied simultaniously are supported, parse them all and corresponding alphas from cmd parameters: + for(size_t i = 0; i < (argc - 3)/2; ++i) { + ov::genai::Adapter adapter(argv[3 + 2*i]); + float alpha = std::atof(argv[3 + 2*i + 1]); + adapter_config.add(adapter, alpha); + } + + // LoRA adapters passed to the constructor will be activated by default in next generates + ov::genai::Text2ImagePipeline pipe(models_path, device, ov::genai::adapters(adapter_config)); + + std::cout << "Generating image with LoRA adapters applied, resulting image will be in lora.bmp\n"; + ov::Tensor image = pipe.generate(prompt, + ov::genai::random_generator(std::make_shared(42)), + ov::genai::width(512), + ov::genai::height(896), + ov::genai::num_inference_steps(20)); + imwrite("lora.bmp", image, true); + + std::cout << "Generating image without LoRA adapters applied, resulting image will be in baseline.bmp\n"; + image = pipe.generate(prompt, + ov::genai::adapters(), // passing adapters in generate overrides adapters set in the constructor; adapters() means no adapters + ov::genai::random_generator(std::make_shared(42)), + ov::genai::width(512), + ov::genai::height(896), + ov::genai::num_inference_steps(20)); + imwrite("baseline.bmp", image, true); + + return EXIT_SUCCESS; +} catch (const std::exception& error) { + try { + std::cerr << error.what() << '\n'; + } catch (const std::ios_base::failure&) {} + return EXIT_FAILURE; +} catch (...) { + try { + std::cerr << "Non-exception object thrown\n"; + } catch (const std::ios_base::failure&) {} + return EXIT_FAILURE; +} diff --git a/samples/cpp/stable_diffusion/main.cpp b/samples/cpp/text2image/main.cpp similarity index 100% rename from samples/cpp/stable_diffusion/main.cpp rename to samples/cpp/text2image/main.cpp diff --git a/src/cpp/include/openvino/genai/generation_config.hpp b/src/cpp/include/openvino/genai/generation_config.hpp index 5d6bce880f..a1244d3d75 100644 --- a/src/cpp/include/openvino/genai/generation_config.hpp +++ b/src/cpp/include/openvino/genai/generation_config.hpp @@ -161,8 +161,6 @@ static constexpr ov::Property presence_penalty{"presence_penalty"}; static constexpr ov::Property frequency_penalty{"frequency_penalty"}; static constexpr ov::Property rng_seed{"rng_seed"}; -static constexpr AdaptersProperty adapters; - // Predefined Configs OPENVINO_GENAI_EXPORTS GenerationConfig beam_search(); OPENVINO_GENAI_EXPORTS GenerationConfig greedy(); diff --git a/src/cpp/include/openvino/genai/lora_adapter.hpp b/src/cpp/include/openvino/genai/lora_adapter.hpp index 388ccdb941..5748abb807 100644 --- a/src/cpp/include/openvino/genai/lora_adapter.hpp +++ b/src/cpp/include/openvino/genai/lora_adapter.hpp @@ -92,7 +92,9 @@ struct OPENVINO_GENAI_EXPORTS AdapterConfig { class AdaptersProperty : public ov::Property { public: - constexpr AdaptersProperty() : ov::Property("adapters") {} + inline constexpr static const char* name () { return "adapters"; } + + constexpr AdaptersProperty() : ov::Property(name()) {} inline std::pair operator()(const AdapterConfig& config) const { return ov::Property::operator()(config); @@ -154,6 +156,9 @@ class AdaptersProperty : public ov::Property { }; +static constexpr AdaptersProperty adapters; + + class OPENVINO_GENAI_EXPORTS AdapterController { std::shared_ptr m_pimpl; @@ -165,15 +170,12 @@ class OPENVINO_GENAI_EXPORTS AdapterController { AdapterController(std::shared_ptr model, const AdapterConfig& config, const std::string& prefix, std::string device = ""); - // Call it every time when adapter config is changed; if adapter is configured as a static one, this call is not required - void apply(ov::InferRequest& request, const AdapterConfig& config); + // Apply adapters configured in the current config set last time, or set and use new config given as optional `config` argument + void apply(ov::InferRequest& request, const std::optional& config = std::nullopt); // the next call of apply will set all adapter tensors regardless of config change, use this method if full state.reset is called for the controlled model void force_full_apply(bool full_apply = true); - // Apply the same config that was used last time (in initialization or in previous call to apply). - void apply(ov::InferRequest& request); - operator bool() const { return bool(m_pimpl); } diff --git a/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp b/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp index 4f348156c2..01bf6f6fdd 100644 --- a/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp +++ b/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp @@ -7,6 +7,7 @@ #include "openvino/genai/visibility.hpp" #include "openvino/genai/tokenizer.hpp" +#include "openvino/genai/lora_adapter.hpp" #include "openvino/core/any.hpp" #include "openvino/runtime/tensor.hpp" @@ -53,10 +54,13 @@ class OPENVINO_GENAI_EXPORTS CLIPTextModel { return compile(device, ov::AnyMap{std::forward(properties)...}); } + void set_adapters(const AdapterConfig& adapters); + ov::Tensor infer(const std::string& pos_prompt, const std::string& neg_prompt, bool do_classifier_free_guidance); private: Config m_config; + AdapterController m_adapter_controller; ov::InferRequest m_request; std::shared_ptr m_model; diff --git a/src/cpp/include/openvino/genai/text2image/pipeline.hpp b/src/cpp/include/openvino/genai/text2image/pipeline.hpp index 952e775f2d..1fa779cbb7 100644 --- a/src/cpp/include/openvino/genai/text2image/pipeline.hpp +++ b/src/cpp/include/openvino/genai/text2image/pipeline.hpp @@ -13,6 +13,7 @@ #include "openvino/genai/visibility.hpp" +#include "openvino/genai/lora_adapter.hpp" #include "openvino/genai/text2image/clip_text_model.hpp" #include "openvino/genai/text2image/unet2d_condition_model.hpp" #include "openvino/genai/text2image/autoencoder_kl.hpp" @@ -81,6 +82,8 @@ class OPENVINO_GENAI_EXPORTS Text2ImagePipeline { int64_t width = -1; size_t num_inference_steps = 50; + AdapterConfig adapters; + void update_generation_config(const ov::AnyMap& config_map); // checks whether is config is valid @@ -96,6 +99,13 @@ class OPENVINO_GENAI_EXPORTS Text2ImagePipeline { Text2ImagePipeline(const std::string& root_dir, const std::string& device, const ov::AnyMap& properties = {}); + template ::value, bool>::type = true> + Text2ImagePipeline(const std::string& root_dir, + const std::string& device, + Properties&&... properties) + : Text2ImagePipeline(root_dir, device, ov::AnyMap{std::forward(properties)...}) { } + // creates either LCM or SD pipeline from building blocks static Text2ImagePipeline stable_diffusion( const std::shared_ptr& scheduler_type, diff --git a/src/cpp/include/openvino/genai/text2image/unet2d_condition_model.hpp b/src/cpp/include/openvino/genai/text2image/unet2d_condition_model.hpp index b5b5288049..b3cfe1d364 100644 --- a/src/cpp/include/openvino/genai/text2image/unet2d_condition_model.hpp +++ b/src/cpp/include/openvino/genai/text2image/unet2d_condition_model.hpp @@ -14,6 +14,7 @@ #include "openvino/runtime/tensor.hpp" #include "openvino/runtime/infer_request.hpp" #include "openvino/runtime/properties.hpp" +#include "openvino/genai/lora_adapter.hpp" namespace ov { namespace genai { @@ -61,10 +62,13 @@ class OPENVINO_GENAI_EXPORTS UNet2DConditionModel { void set_hidden_states(const std::string& tensor_name, ov::Tensor encoder_hidden_states); + void set_adapters(const AdapterConfig& adapters); + ov::Tensor infer(ov::Tensor sample, ov::Tensor timestep); private: Config m_config; + AdapterController m_adapter_controller; std::shared_ptr m_model; ov::InferRequest m_request; size_t m_vae_scale_factor; diff --git a/src/cpp/src/llm_pipeline.cpp b/src/cpp/src/llm_pipeline.cpp index a00c3c630f..4a46b525e7 100644 --- a/src/cpp/src/llm_pipeline.cpp +++ b/src/cpp/src/llm_pipeline.cpp @@ -16,6 +16,7 @@ #include "utils.hpp" #include "text_callback_streamer.hpp" #include "openvino/genai/lora_adapter.hpp" +#include "lora_helper.hpp" namespace { @@ -94,12 +95,8 @@ class StatefulLLMPipeline final : public LLMPipelineImplBase { LLMPipelineImplBase(tokenizer, utils::from_config_json_if_exists(model_path)) { ov::Core core; - auto adapters_iter = plugin_config.find(ov::genai::adapters.name()); - if (adapters_iter != plugin_config.end()) { - m_generation_config.adapters = adapters_iter->second.as(); - auto filtered_plugin_config = plugin_config; - filtered_plugin_config.erase(ov::genai::adapters.name()); - auto [core_plugin_config, compile_plugin_config] = ov::genai::utils::split_core_complile_config(filtered_plugin_config); + if(auto filtered_plugin_config = extract_adapters_from_properties(plugin_config, &m_generation_config.adapters)) { + auto [core_plugin_config, compile_plugin_config] = ov::genai::utils::split_core_complile_config(*filtered_plugin_config); core.set_property(core_plugin_config); auto model = core.read_model(model_path / "openvino_model.xml"); m_adapter_controller = AdapterController(model, m_generation_config.adapters, "base_model.model.model.", device); // TODO: Make the prefix name configurable diff --git a/src/cpp/src/lora_adapter.cpp b/src/cpp/src/lora_adapter.cpp index 216fca98a4..2bfd1d5ca1 100644 --- a/src/cpp/src/lora_adapter.cpp +++ b/src/cpp/src/lora_adapter.cpp @@ -491,7 +491,7 @@ class LoRATransformBase : public ov::pass::MatcherPass { // Builds LoRA subgraph that consists of several matrix and element-wise multiplications with optional data type conversions and reshapes // to build a consistent graph. -NodePtr tensors_multiplication(NodePtr input, const NodeVector multipliers, ov::Output target, bool transpose_weights, size_t alpha_pos) { +NodePtr tensors_multiplication(NodePtr input, const NodeVector multipliers, ov::Output target, bool transpose_weights, size_t alpha_pos, bool transpose_in_end) { const auto target_type = target.get_element_type(); const auto target_shape = target.get_partial_shape(); const auto target_rank = target_shape.rank().get_length(); @@ -516,7 +516,7 @@ NodePtr tensors_multiplication(NodePtr input, const NodeVector multipliers, ov:: } } - if(target_rank == 4 && target_shape[-1].is_static() && target_shape[-1].get_length() > 1) { // FIXME: Check all potentially permuted dimensions, not only the last one + if(transpose_in_end) { // FIXME: Check the dimensions we really need to move, currently it is hardcoded 2 + 2 dimensions that usually appears in 2D Convolution case // where we need to apply LoRA for the first two dimensions (channels) while interpreting two last dimensions (spatial ) // TODO: Stash transposition constant to reuse @@ -648,7 +648,7 @@ class LoRAFuseTransform : public LoRATransformBase { for(auto multiplier : adapter) { parameters.push_back(std::make_shared(multiplier->get_output_element_type(0), multiplier->get_output_partial_shape(0))); } - auto result = std::make_shared(tensors_multiplication(nullptr, NodeVector{parameters.begin() + 1, parameters.end()}, target, false, 1)); + auto result = std::make_shared(tensors_multiplication(nullptr, NodeVector{parameters.begin() + 1, parameters.end()}, target, false, 1, false)); auto weights_model = std::make_shared(ov::ResultVector{result}, parameters); fusers.insert(signature, weights_model); } @@ -699,6 +699,7 @@ class LoRASeparateTransform : public LoRATransformBase { auto target_rank = target.get_partial_shape().rank().get_length(); auto consumers = target.get_target_inputs(); + bool transpose_in_end = false; // FIXME: Should check rank of activations instead of target rank if(target_rank == 4 && target.get_partial_shape()[target_rank - 3].get_length() > 1) { @@ -707,10 +708,11 @@ class LoRASeparateTransform : public LoRATransformBase { auto transposition = v0::Constant::create(ov::element::i32, ov::Shape{4}, std::vector{2, 3, 0, 1}); auto transpose = register_new_node(activations, transposition); activations = transpose; + transpose_in_end = true; } NodeVector lora_variables{lora_weight.A, lora_weight.alpha, lora_weight.B}; - replacement = tensors_multiplication(activations.get_node_shared_ptr(), lora_variables, target, true, 1); + replacement = tensors_multiplication(activations.get_node_shared_ptr(), lora_variables, target, true, 1, transpose_in_end); for (auto consumer : consumers) { consumer.replace_source_output(replacement->output(0)); @@ -843,7 +845,7 @@ struct AdapterControllerImpl { } struct ConfigChanged { - bool mode; + bool mode = false; bool alpha = false; bool adapter = false; @@ -872,25 +874,28 @@ struct AdapterControllerImpl { return diff; } - void apply (ov::InferRequest& infer_request, const AdapterConfig& config) { + void apply (ov::InferRequest& infer_request, std::optional config) { // FIXME: If a part of LoRA state tensors are not set here, then need to carefully reset state in LLMPipeline where global reset is called after the generation - - const auto diff = compare_configs(current_config, config); - OPENVINO_ASSERT( - !diff.mode || config.get_mode() == AdapterConfig::MODE_AUTO, // MODE_AUTO in this call means that mode is not changed - "AdapterConfig::mode cannot be changed and should be configured once for a model at the initialization"); - OPENVINO_ASSERT( - config.get_mode() == AdapterConfig::MODE_AUTO || config.get_mode() == AdapterConfig::MODE_DYNAMIC || config.get_mode() == AdapterConfig::MODE_STATIC_RANK || (!diff.alpha && !diff.adapter), - "Cannot change adapters and/or the alphas when not one of the dynamic modes are used."); + ConfigChanged diff; + if(config) { + diff = compare_configs(current_config, *config); + OPENVINO_ASSERT( + !diff.mode || config->get_mode() == AdapterConfig::MODE_AUTO, // MODE_AUTO in this call means that mode is not changed + "AdapterConfig::mode cannot be changed and should be configured once for a model at the initialization"); + OPENVINO_ASSERT( + config->get_mode() == AdapterConfig::MODE_AUTO || config->get_mode() == AdapterConfig::MODE_DYNAMIC || config->get_mode() == AdapterConfig::MODE_STATIC_RANK || (!diff.alpha && !diff.adapter), + "Cannot change adapters and/or the alphas when not one of the dynamic modes are used."); + current_config = *config; + } if(need_full_apply) { need_full_apply = false; - set_new_adapter_tensors(infer_request, config); + set_new_adapter_tensors(infer_request); } else if(diff) { if(diff.adapter) { - set_new_adapter_tensors(infer_request, config); + set_new_adapter_tensors(infer_request); } else { OPENVINO_ASSERT(diff.alpha); - set_new_adapter_alphas(infer_request, config); + set_new_adapter_alphas(infer_request); } } } @@ -899,13 +904,12 @@ struct AdapterControllerImpl { need_full_apply = full_apply; } - void set_new_adapter_alphas (ov::InferRequest& infer_request, const AdapterConfig& config) { + void set_new_adapter_alphas (ov::InferRequest& infer_request) { // FIXME: Provide more economical way to update only alphas - set_new_adapter_tensors(infer_request, config); + set_new_adapter_tensors(infer_request); } - void set_new_adapter_tensors (ov::InferRequest& infer_request, const AdapterConfig& config) { - current_config = config; // FIXME: Keep the old config to map to cached LoRA state tensors instead of the current approach where we start from scratch each time + void set_new_adapter_tensors (ov::InferRequest& infer_request) { if(current_config.get_mode() != AdapterConfig::MODE_AUTO && current_config.get_mode() != AdapterConfig::MODE_DYNAMIC && current_config.get_mode() != AdapterConfig::MODE_STATIC_RANK ) { return; } @@ -1163,10 +1167,6 @@ struct AdapterControllerImpl { } return new_tensors; } - - void apply (ov::InferRequest& infer_request) { - return apply(infer_request, current_config); - } }; @@ -1207,13 +1207,13 @@ AdapterController::AdapterController(std::shared_ptr model, const Ada // Call it every time when adapter config is changed; if adapter was configured as a static one, this call is not required -void AdapterController::apply(ov::InferRequest& request, const AdapterConfig& config) { - return m_pimpl->apply(request, config); -} - - -void AdapterController::apply(ov::InferRequest& request){ - return m_pimpl->apply(request); +void AdapterController::apply(ov::InferRequest& request, const std::optional& config) { + OPENVINO_ASSERT(m_pimpl || !config || !*config, + "Adapters are passed to AdapterController but it was not configured to use adapters. " + "Enable using adapters by pass them in the constructor first."); + if (m_pimpl) { + m_pimpl->apply(request, config); + } } diff --git a/src/cpp/src/lora_helper.cpp b/src/cpp/src/lora_helper.cpp new file mode 100644 index 0000000000..7e7a6e613c --- /dev/null +++ b/src/cpp/src/lora_helper.cpp @@ -0,0 +1,28 @@ +#include "lora_helper.hpp" + + +namespace ov { +namespace genai { + +std::optional extract_adapters_from_properties (const AnyMap& properties, AdapterConfig* adapter_config) { + auto adapters_iter = properties.find(AdaptersProperty::name()); + if (adapters_iter != properties.end()) { + if(adapter_config) { + *adapter_config = adapters_iter->second.as(); + } + auto filtered_properties = properties; + filtered_properties.erase(AdaptersProperty::name()); + return filtered_properties; + } + return std::nullopt; +} + +void update_adapters_from_properties (const AnyMap& properties, AdapterConfig& adapter_config) { + auto adapters_iter = properties.find(AdaptersProperty::name()); + if (adapters_iter != properties.end()) { + adapter_config = adapters_iter->second.as(); + } +} + +} +} \ No newline at end of file diff --git a/src/cpp/src/lora_helper.hpp b/src/cpp/src/lora_helper.hpp new file mode 100644 index 0000000000..b9e41e8b4c --- /dev/null +++ b/src/cpp/src/lora_helper.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "openvino/genai/lora_adapter.hpp" + + +namespace ov { +namespace genai { + +// Search for `adapters` property in `properties` map. If it is found and `adapter_config` is not nullptr, +// set `adapter_config` with found value, and return a copy of `properties` with the `adapters` property removed. +// If there is no `adapters` property, `adapter_config` is left unchanged and std::nullopt is returned. +std::optional extract_adapters_from_properties (const AnyMap& properties, AdapterConfig* adapter_config = nullptr); + +// Search for `adapters` property in `properties` map. If it is found, set `adapter_config` with found value. +// If `adapters` property is not found, do nothing. +void update_adapters_from_properties (const AnyMap& properties, AdapterConfig& adapter_config); + +} +} \ No newline at end of file diff --git a/src/cpp/src/text2image/models/autoencoder_kl.cpp b/src/cpp/src/text2image/models/autoencoder_kl.cpp index e9aec9528f..30b378963b 100644 --- a/src/cpp/src/text2image/models/autoencoder_kl.cpp +++ b/src/cpp/src/text2image/models/autoencoder_kl.cpp @@ -14,6 +14,7 @@ #include "openvino/op/constant.hpp" #include "utils.hpp" +#include "lora_helper.hpp" namespace ov { namespace genai { @@ -43,7 +44,11 @@ AutoencoderKL::AutoencoderKL(const std::string& root_dir, const std::string& device, const ov::AnyMap& properties) : AutoencoderKL(root_dir) { - compile(device, properties); + if(auto filtered_properties = extract_adapters_from_properties(properties)) { + compile(device, *filtered_properties); + } else { + compile(device, properties); + } } AutoencoderKL::AutoencoderKL(const AutoencoderKL&) = default; diff --git a/src/cpp/src/text2image/models/clip_text_model.cpp b/src/cpp/src/text2image/models/clip_text_model.cpp index d42a07f9c1..c1035709fd 100644 --- a/src/cpp/src/text2image/models/clip_text_model.cpp +++ b/src/cpp/src/text2image/models/clip_text_model.cpp @@ -8,6 +8,7 @@ #include "openvino/runtime/core.hpp" #include "utils.hpp" +#include "lora_helper.hpp" namespace ov { namespace genai { @@ -33,7 +34,13 @@ CLIPTextModel::CLIPTextModel(const std::string& root_dir, const std::string& device, const ov::AnyMap& properties) : CLIPTextModel(root_dir) { - compile(device, properties); + AdapterConfig adapters; + if(auto filtered_properties = extract_adapters_from_properties(properties, &adapters)) { + m_adapter_controller = AdapterController(m_model, adapters, "lora_te", device); + compile(device, *filtered_properties); + } else { + compile(device, properties); + } } CLIPTextModel::CLIPTextModel(const CLIPTextModel&) = default; @@ -64,6 +71,10 @@ CLIPTextModel& CLIPTextModel::compile(const std::string& device, const ov::AnyMa return *this; } +void CLIPTextModel::set_adapters(const AdapterConfig& adapters) { + m_adapter_controller.apply(m_request, adapters); +} + ov::Tensor CLIPTextModel::infer(const std::string& pos_prompt, const std::string& neg_prompt, bool do_classifier_free_guidance) { OPENVINO_ASSERT(m_request, "CLIP text encoder model must be compiled first. Cannot infer non-compiled model"); diff --git a/src/cpp/src/text2image/models/unet2d_condition_model.cpp b/src/cpp/src/text2image/models/unet2d_condition_model.cpp index 69563fb7c4..ebc284d620 100644 --- a/src/cpp/src/text2image/models/unet2d_condition_model.cpp +++ b/src/cpp/src/text2image/models/unet2d_condition_model.cpp @@ -8,6 +8,7 @@ #include "openvino/runtime/core.hpp" #include "utils.hpp" +#include "lora_helper.hpp" namespace ov { namespace genai { @@ -36,7 +37,13 @@ UNet2DConditionModel::UNet2DConditionModel(const std::string& root_dir, const std::string& device, const ov::AnyMap& properties) : UNet2DConditionModel(root_dir) { - compile(device, properties); + AdapterConfig adapters; + if(auto filtered_properties = extract_adapters_from_properties(properties, &adapters)) { + m_adapter_controller = AdapterController(m_model, adapters, "lora_unet", device); + compile(device, *filtered_properties); + } else { + compile(device, properties); + } } UNet2DConditionModel::UNet2DConditionModel(const UNet2DConditionModel&) = default; @@ -92,6 +99,10 @@ void UNet2DConditionModel::set_hidden_states(const std::string& tensor_name, ov: m_request.set_tensor(tensor_name, encoder_hidden_states); } +void UNet2DConditionModel::set_adapters(const AdapterConfig& adapters) { + m_adapter_controller.apply(m_request, adapters); +} + ov::Tensor UNet2DConditionModel::infer(ov::Tensor sample, ov::Tensor timestep) { OPENVINO_ASSERT(m_request, "UNet model must be compiled first. Cannot infer non-compiled model"); diff --git a/src/cpp/src/text2image/stable_diffusion_pipeline.hpp b/src/cpp/src/text2image/stable_diffusion_pipeline.hpp index 84251cb21f..54d2d43c19 100644 --- a/src/cpp/src/text2image/stable_diffusion_pipeline.hpp +++ b/src/cpp/src/text2image/stable_diffusion_pipeline.hpp @@ -7,6 +7,7 @@ #include #include "utils.hpp" +#include "lora_helper.hpp" namespace ov { namespace genai { @@ -106,6 +107,8 @@ class Text2ImagePipeline::StableDiffusionPipeline : public Text2ImagePipeline::D // initialize generation config initialize_generation_config(data["_class_name"].get()); + + update_adapters_from_properties(properties, m_generation_config.adapters); } StableDiffusionPipeline( @@ -149,6 +152,9 @@ class Text2ImagePipeline::StableDiffusionPipeline : public Text2ImagePipeline::D generation_config.width = unet_config.sample_size * vae_scale_factor; check_inputs(generation_config.height, generation_config.width); + m_clip_text_encoder->set_adapters(generation_config.adapters); + m_unet->set_adapters(generation_config.adapters); + if (generation_config.random_generator == nullptr) { uint32_t seed = time(NULL); generation_config.random_generator = std::make_shared(seed); diff --git a/src/cpp/src/text2image/text2image_pipeline.cpp b/src/cpp/src/text2image/text2image_pipeline.cpp index b8a8e1898b..e5acb1eacc 100644 --- a/src/cpp/src/text2image/text2image_pipeline.cpp +++ b/src/cpp/src/text2image/text2image_pipeline.cpp @@ -44,7 +44,8 @@ void Text2ImagePipeline::GenerationConfig::update_generation_config(const ov::An read_anymap_param(properties, "height", height); read_anymap_param(properties, "width", width); read_anymap_param(properties, "num_inference_steps", num_inference_steps); - + read_anymap_param(properties, "adapters", adapters); + validate(); } @@ -59,7 +60,7 @@ void Text2ImagePipeline::GenerationConfig::validate() const { Text2ImagePipeline::Text2ImagePipeline(const std::string& root_dir) { const std::string class_name = get_class_name(root_dir); - if (class_name == "StableDiffusionPipeline" || + if (class_name == "StableDiffusionPipeline" || class_name == "LatentConsistencyModelPipeline") { m_impl = std::make_shared(root_dir); } else { @@ -70,7 +71,7 @@ Text2ImagePipeline::Text2ImagePipeline(const std::string& root_dir) { Text2ImagePipeline::Text2ImagePipeline(const std::string& root_dir, const std::string& device, const ov::AnyMap& properties) { const std::string class_name = get_class_name(root_dir); - if (class_name == "StableDiffusionPipeline" || + if (class_name == "StableDiffusionPipeline" || class_name == "LatentConsistencyModelPipeline") { m_impl = std::make_shared(root_dir, device, properties); } else { @@ -78,7 +79,7 @@ Text2ImagePipeline::Text2ImagePipeline(const std::string& root_dir, const std::s } } -Text2ImagePipeline::Text2ImagePipeline(const std::shared_ptr& impl) +Text2ImagePipeline::Text2ImagePipeline(const std::shared_ptr& impl) : m_impl(impl) { assert(m_impl != nullptr); } From d3bb229a2b2d698581bc0685a3d43eec6cad0278 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 7 Oct 2024 20:00:20 +0400 Subject: [PATCH 04/42] Clean up VLMPipeline Address comments in https://github.com/openvinotoolkit/openvino.genai/pull/912 --- .github/workflows/causal_lm_cpp.yml | 4 +- samples/cpp/visual_language_chat/README.md | 2 +- .../visual_language_chat.cpp | 2 +- src/cpp/CMakeLists.txt | 4 +- .../include/openvino/genai/vision_encoder.hpp | 8 +- .../include/openvino/genai/vlm_pipeline.hpp | 31 +- src/cpp/src/clip.cpp | 3 - src/cpp/src/clip.hpp | 4 +- src/cpp/src/stb_image.hpp | 8396 ----------------- src/cpp/src/utils.hpp | 5 - src/cpp/src/vision_encoder.cpp | 40 +- src/cpp/src/vlm_pipeline.cpp | 35 +- 12 files changed, 61 insertions(+), 8473 deletions(-) delete mode 100644 src/cpp/src/stb_image.hpp diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index 7b0c7df454..387b3a79dd 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -711,10 +711,10 @@ jobs: - run: > source ./ov/setupvars.sh && python ./samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py ./miniCPM-V-2_6/ - - run: wget https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 + - run: wget https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 --output-document cat.jpg - run: > source ./ov/setupvars.sh - && ./build/samples/cpp/visual_language_chat/visual_language_chat ./miniCPM-V-2_6/ d5fbbd1a-d484-415c-88cb-9986625b7b11 + && ./build/samples/cpp/visual_language_chat/visual_language_chat ./miniCPM-V-2_6/ cat.jpg <<< $'What is on the image?\nWhat is special on the image?' timeout-minutes: 110 diff --git a/samples/cpp/visual_language_chat/README.md b/samples/cpp/visual_language_chat/README.md index 49d4545850..b9d0ebcfe4 100644 --- a/samples/cpp/visual_language_chat/README.md +++ b/samples/cpp/visual_language_chat/README.md @@ -15,7 +15,7 @@ export_MiniCPM-V-2_6.py miniCPM-V-2_6 ## Run -https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 can be used as a sample image. +[This image](https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11) can be used as a sample image. `visual_language_chat miniCPM-V-2_6 319483352-d5fbbd1a-d484-415c-88cb-9986625b7b11.jpg` diff --git a/samples/cpp/visual_language_chat/visual_language_chat.cpp b/samples/cpp/visual_language_chat/visual_language_chat.cpp index 838a1be78e..a7ec36c4c5 100644 --- a/samples/cpp/visual_language_chat/visual_language_chat.cpp +++ b/samples/cpp/visual_language_chat/visual_language_chat.cpp @@ -31,7 +31,7 @@ int main(int argc, char* argv[]) try { } pipe.generate( prompt, - ov::genai::image(std::move(image)), + ov::genai::image(image), ov::genai::streamer(print_subword) ); std::cout << "\n----------\n" diff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt index da4540bb90..20b547052c 100644 --- a/src/cpp/CMakeLists.txt +++ b/src/cpp/CMakeLists.txt @@ -51,7 +51,9 @@ file(GLOB_RECURSE SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp" "${CMAKE_ set(TARGET_NAME openvino_genai) add_library(${TARGET_NAME} SHARED ${SOURCE_FILES}) -add_dependencies(${TARGET_NAME} openvino_tokenizers) +if(TARGET openvino_tokenizers) + add_dependencies(${TARGET_NAME} openvino_tokenizers) +endif() add_library(openvino::genai ALIAS ${TARGET_NAME}) target_include_directories(${TARGET_NAME} diff --git a/src/cpp/include/openvino/genai/vision_encoder.hpp b/src/cpp/include/openvino/genai/vision_encoder.hpp index 7370b7f8aa..474216736c 100644 --- a/src/cpp/include/openvino/genai/vision_encoder.hpp +++ b/src/cpp/include/openvino/genai/vision_encoder.hpp @@ -8,7 +8,7 @@ namespace ov::genai { /// @brief A pair describing image size. -struct HeightWidth { +struct ImageSize { /// @brief Height of a corresponding image. size_t height; /// @brief Width of a corresponding image. @@ -25,16 +25,16 @@ struct EncodedImage { ov::Tensor resized_source; /// @brief A size of an image used to compute embeddings for /// divided by ProcessorConfig's patch_size. - HeightWidth resized_source_size; + ImageSize resized_source_size; /// @brief Embeddings of images obtained from a source image by /// slicing at no more than max_slice_nums pieces and resizing. /// The tensor's shape is /// [slice_y, slice_x, number_of_embeddings, embedding_size]. /// slices_sizes.size() == slice_y * slice_x. ov::Tensor slices; - /// @brief Flattened sizes of images used to compute embeddings + /// @brief A size of images used to compute embeddings /// stored in slices member divided by ProcessorConfig's patch_size. - std::vector slices_sizes; + ImageSize slices_size; }; /// @brief A class used to infer embeddings of an image using diff --git a/src/cpp/include/openvino/genai/vlm_pipeline.hpp b/src/cpp/include/openvino/genai/vlm_pipeline.hpp index 85ea9dd661..b3318fa5b1 100644 --- a/src/cpp/include/openvino/genai/vlm_pipeline.hpp +++ b/src/cpp/include/openvino/genai/vlm_pipeline.hpp @@ -65,37 +65,14 @@ class OPENVINO_GENAI_EXPORTS VLMPipeline { explicit VLMPipeline( const std::filesystem::path& model_dir, const std::string& device="CPU", - const ov::AnyMap device_config={}, - ov::Core core=ov::Core{} - ) : VLMPipeline{ - model_dir, - Tokenizer(model_dir.string(), device_config), - device, - device_config, - core - } {} - - /// @brief Construct a pipeline form a folder containing model IRs - /// and from a Tokenizer instance. - /// @param model_dir A folder to read model IRs. - /// @param tokenizer An instance of Tokenizer to use. - /// @param device Inference device. - /// @param device_config A config to pass to ov::Core.set_property() - /// and ov::Core::compile_model(). - /// @param core ov::Core instance to use. - VLMPipeline( - const std::filesystem::path& model_dir, - const ov::genai::Tokenizer& tokenizer, - const std::string& device="CPU", - const ov::AnyMap device_config={}, - ov::Core core=ov::Core{} + const ov::AnyMap device_config={} ); /// @brief Default destructor. ~VLMPipeline(); /// @brief Generate a response given a prompt and any number of - /// uint8 RGB images. + /// uint8 RGB images with [HWC] layout. /// @param prompt A prompt to respond to. /// @param images Images to be prepended to a prompt. /// @param generation_config A config to follow for text generation. @@ -120,7 +97,7 @@ class OPENVINO_GENAI_EXPORTS VLMPipeline { /// @brief Generate a response given a prompt and arbitrary number /// of ov::Property instances. /// Example: - /// generate("text", image(std::move(rgb)), do_sample(true)); + /// generate("text", image(rgb), do_sample(true)); /// @param prompt A prompt to respond to. /// @param ...properties ov::Property instances to be combined into /// ov::AnyMap. @@ -166,7 +143,7 @@ class OPENVINO_GENAI_EXPORTS VLMPipeline { /* * utils that allow to use generate() in the following way: - * pipe.generate(prompt, ov::genai::image(std::move(image_tensor))). + * pipe.generate(prompt, ov::genai::image(image_tensor)). */ static constexpr ov::Property image{"image"}; static constexpr ov::Property> images{"images"}; diff --git a/src/cpp/src/clip.cpp b/src/cpp/src/clip.cpp index bb416519bb..93adc26eb2 100644 --- a/src/cpp/src/clip.cpp +++ b/src/cpp/src/clip.cpp @@ -6,9 +6,6 @@ // I'll gradually clean and extend it // Note: Even when using identical normalized image inputs (see normalize_image_u8_to_f32()) we have a significant difference in resulting embeddings compared to pytorch -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.hpp" - #include #include #include diff --git a/src/cpp/src/clip.hpp b/src/cpp/src/clip.hpp index 99c06a05d2..bce6cc8970 100644 --- a/src/cpp/src/clip.hpp +++ b/src/cpp/src/clip.hpp @@ -1,8 +1,7 @@ // Copyright (C) 2023-2024 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -#ifndef CLIP_H -#define CLIP_H +#pragma once #include #include @@ -53,4 +52,3 @@ bool bicubic_resize(const clip_image_u8& img, clip_image_u8& dst, int target_wid /** preprocess img and store the result in res_imgs, pad_to_square may be overriden to false depending on model configuration */ clip_image_f32 clip_image_preprocess(struct clip_ctx& ctx, const clip_image_u8& img); -#endif // CLIP_H diff --git a/src/cpp/src/stb_image.hpp b/src/cpp/src/stb_image.hpp deleted file mode 100644 index 4766d7e675..0000000000 --- a/src/cpp/src/stb_image.hpp +++ /dev/null @@ -1,8396 +0,0 @@ -/* stb_image - v2.28 - public domain image loader - http://nothings.org/stb - no warranty implied; use at your own risk - - Do this: - #define STB_IMAGE_IMPLEMENTATION - before you include this file in *one* C or C++ file to create the implementation. - - // i.e. it should look like this: - #include ... - #include ... - #include ... - #define STB_IMAGE_IMPLEMENTATION - #include "stb_image.h" - - You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. - And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free - - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8/16-bit-per-channel - - TGA (not sure what subset, if a subset) - BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels, 8/16 bit-per-channel) - - GIF (*comp always reports as 4-channel) - HDR (radiance rgbE format) - PIC (Softimage PIC) - PNM (PPM and PGM binary only) - - Animated GIF still needs a proper API, but here's one way to do it: - http://gist.github.com/urraka/685d9a6340b26b830d49 - - - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - - decode from arbitrary I/O callbacks - - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) - - Full documentation under "DOCUMENTATION" below. - - -LICENSE - - See end of file for license information. - -RECENT REVISION HISTORY: - - 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff - 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes - 2.26 (2020-07-13) many minor fixes - 2.25 (2020-02-02) fix warnings - 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically - 2.23 (2019-08-11) fix clang static analysis warning - 2.22 (2019-03-04) gif fixes, fix warnings - 2.21 (2019-02-25) fix typo in comment - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings - 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes - 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 - RGB-format JPEG; remove white matting in PSD; - allocate large structures on the stack; - correct channel count for PNG & BMP - 2.10 (2016-01-22) avoid warning introduced in 2.09 - 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED - - See end of file for full revision history. - - - ============================ Contributors ========================= - - Image formats Extensions, features - Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) - Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) - Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) - Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) - Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) - Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) - Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) - github:urraka (animated gif) Junggon Kim (PNM comments) - Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) - socks-the-fox (16-bit PNG) - Jeremy Sawicki (handle all ImageNet JPGs) - Optimizations & bugfixes Mikhail Morozov (1-bit BMP) - Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) - Arseny Kapoulkine Simon Breuss (16-bit PNM) - John-Mark Allen - Carmelo J Fdez-Aguera - - Bug & warning fixes - Marc LeBlanc David Woo Guillaume George Martins Mozeiko - Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski - Phil Jordan Dave Moore Roy Eltham - Hayaki Saito Nathan Reed Won Chun - Luke Graham Johan Duparc Nick Verigakis the Horde3D community - Thomas Ruf Ronny Chevalier github:rlyeh - Janez Zemva John Bartholomew Michal Cichon github:romigrou - Jonathan Blow Ken Hamada Tero Hanninen github:svdijk - Eugene Golushkov Laurent Gomila Cort Stratton github:snagar - Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex - Cass Everitt Ryamond Barbiero github:grim210 - Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw - Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus - Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo - Julian Raschke Gregory Mullen Christian Floisand github:darealshinji - Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 - Brad Weinberger Matvey Cherevko github:mosra - Luca Sas Alexander Veselov Zack Middleton [reserved] - Ryan C. Gordon [reserved] [reserved] - DO NOT ADD YOUR NAME HERE - - Jacko Dirks - - To add your name to the credits, pick a random blank space in the middle and fill it. - 80% of merge conflicts on stb PRs are due to people adding their name at the end - of the credits. -*/ - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -// DOCUMENTATION -// -// Limitations: -// - no 12-bit-per-channel JPEG -// - no JPEGs with arithmetic coding -// - GIF always returns *comp=4 -// -// Basic usage (see HDR discussion below for HDR usage): -// int x,y,n; -// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... -// // ... x = width, y = height, n = # 8-bit components per pixel ... -// // ... replace '0' with '1'..'4' to force that many components per pixel -// // ... but 'n' will always be the number that it would have been if you said 0 -// stbi_image_free(data); -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *channels_in_file -- outputs # of image components in image file -// int desired_channels -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data, or NULL on an allocation failure or if the image is -// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, -// with each pixel consisting of N interleaved 8-bit components; the first -// pixel pointed to is top-left-most in the image. There is no padding between -// image scanlines or between pixels, regardless of format. The number of -// components N is 'desired_channels' if desired_channels is non-zero, or -// *channels_in_file otherwise. If desired_channels is non-zero, -// *channels_in_file has the number of components that _would_ have been -// output otherwise. E.g. if you set desired_channels to 4, you will always -// get RGBA output, but you can check *channels_in_file to see if it's trivially -// opaque because e.g. there were only 3 channels in the source image. -// -// An output image with N components has the following components interleaved -// in this order in each pixel: -// -// N=#comp components -// 1 grey -// 2 grey, alpha -// 3 red, green, blue -// 4 red, green, blue, alpha -// -// If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *channels_in_file will be unchanged. The function -// stbi_failure_reason() can be queried for an extremely brief, end-user -// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS -// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. -// -// To query the width, height and component count of an image without having to -// decode the full file, you can use the stbi_info family of functions: -// -// int x,y,n,ok; -// ok = stbi_info(filename, &x, &y, &n); -// // returns ok=1 and sets x, y, n if image is a supported format, -// // 0 otherwise. -// -// Note that stb_image pervasively uses ints in its public API for sizes, -// including sizes of memory buffers. This is now part of the API and thus -// hard to change without causing breakage. As a result, the various image -// loaders all have certain limits on image size; these differ somewhat -// by format but generally boil down to either just under 2GB or just under -// 1GB. When the decoded image would be larger than this, stb_image decoding -// will fail. -// -// Additionally, stb_image will reject image files that have any of their -// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, -// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, -// the only way to have an image with such dimensions load correctly -// is for it to have a rather extreme aspect ratio. Either way, the -// assumption here is that such larger images are likely to be malformed -// or malicious. If you do need to load an image with individual dimensions -// larger than that, and it still fits in the overall size limit, you can -// #define STBI_MAX_DIMENSIONS on your own to be something larger. -// -// =========================================================================== -// -// UNICODE: -// -// If compiling for Windows and you wish to use Unicode filenames, compile -// with -// #define STBI_WINDOWS_UTF8 -// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert -// Windows wchar_t filenames to utf8. -// -// =========================================================================== -// -// Philosophy -// -// stb libraries are designed with the following priorities: -// -// 1. easy to use -// 2. easy to maintain -// 3. good performance -// -// Sometimes I let "good performance" creep up in priority over "easy to maintain", -// and for best performance I may provide less-easy-to-use APIs that give higher -// performance, in addition to the easy-to-use ones. Nevertheless, it's important -// to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. -// -// Some secondary priorities arise directly from the first two, some of which -// provide more explicit reasons why performance can't be emphasized. -// -// - Portable ("ease of use") -// - Small source code footprint ("easy to maintain") -// - No dependencies ("ease of use") -// -// =========================================================================== -// -// I/O callbacks -// -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. -// -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). -// -// =========================================================================== -// -// SIMD support -// -// The JPEG decoder will try to automatically use SIMD kernels on x86 when -// supported by the compiler. For ARM Neon support, you must explicitly -// request it. -// -// (The old do-it-yourself SIMD API is no longer supported in the current -// code.) -// -// On x86, SSE2 will automatically be used when available based on a run-time -// test; if not, the generic C versions are used as a fall-back. On ARM targets, -// the typical path is to have separate builds for NEON and non-NEON devices -// (at least this is true for iOS and Android). Therefore, the NEON support is -// toggled by a build flag: define STBI_NEON to get NEON loops. -// -// If for some reason you do not want to use any of SIMD code, or if -// you have issues compiling it, you can disable it entirely by -// defining STBI_NO_SIMD. -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image supports loading HDR images in general, and currently the Radiance -// .HDR file format specifically. You can still load any file through the existing -// interface; if you attempt to load an HDR file, it will be automatically remapped -// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -// both of these constants can be reconfigured through this interface: -// -// stbi_hdr_to_ldr_gamma(2.2f); -// stbi_hdr_to_ldr_scale(1.0f); -// -// (note, do not use _inverse_ constants; stbi_image will invert them -// appropriately). -// -// Additionally, there is a new, parallel interface for loading files as -// (linear) floats to preserve the full dynamic range: -// -// float *data = stbi_loadf(filename, &x, &y, &n, 0); -// -// If you load LDR images through this interface, those images will -// be promoted to floating point values, run through the inverse of -// constants corresponding to the above: -// -// stbi_ldr_to_hdr_scale(1.0f); -// stbi_ldr_to_hdr_gamma(2.2f); -// -// Finally, given a filename (or an open file or memory block--see header -// file for details) containing image data, you can query for the "most -// appropriate" interface to use (that is, whether the image is HDR or -// not), using: -// -// stbi_is_hdr(char *filename); -// -// =========================================================================== -// -// iPhone PNG support: -// -// We optionally support converting iPhone-formatted PNGs (which store -// premultiplied BGRA) back to RGB, even though they're internally encoded -// differently. To enable this conversion, call -// stbi_convert_iphone_png_to_rgb(1). -// -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). -// -// =========================================================================== -// -// ADDITIONAL CONFIGURATION -// -// - You can suppress implementation of any of the decoders to reduce -// your code footprint by #defining one or more of the following -// symbols before creating the implementation. -// -// STBI_NO_JPEG -// STBI_NO_PNG -// STBI_NO_BMP -// STBI_NO_PSD -// STBI_NO_TGA -// STBI_NO_GIF -// STBI_NO_HDR -// STBI_NO_PIC -// STBI_NO_PNM (.ppm and .pgm) -// -// - You can request *only* certain decoders and suppress all other ones -// (this will be more forward-compatible, as addition of new decoders -// doesn't require you to disable them explicitly): -// -// STBI_ONLY_JPEG -// STBI_ONLY_PNG -// STBI_ONLY_BMP -// STBI_ONLY_PSD -// STBI_ONLY_TGA -// STBI_ONLY_GIF -// STBI_ONLY_HDR -// STBI_ONLY_PIC -// STBI_ONLY_PNM (.ppm and .pgm) -// -// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still -// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB -// -// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater -// than that size (in either width or height) without further processing. -// This is to let programs in the wild set an upper bound to prevent -// denial-of-service attacks on untrusted data, as one could generate a -// valid image of gigantic dimensions and force stb_image to allocate a -// huge block of memory and spend disproportionate time decoding it. By -// default this is set to (1 << 24), which is 16777216, but that's still -// very big. - -#ifndef STBI_NO_STDIO -#include -#endif // STBI_NO_STDIO - -#define STBI_VERSION 1 - -enum { - STBI_default = 0, // only used for desired_channels - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -#include -typedef unsigned char stbi_uc; -typedef unsigned short stbi_us; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef STBIDEF -#ifdef STB_IMAGE_STATIC -#define STBIDEF static -#else -#define STBIDEF extern -#endif -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// PRIMARY API - works on images of any type -// - -// -// load image by filename, open file, or memory buffer -// - -typedef struct { - int (*read)(void * user, char * data, - int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip)(void * user, int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative - int (*eof)(void * user); // returns nonzero if we are at end of file/data -} stbi_io_callbacks; - -//////////////////////////////////// -// -// 8-bits-per-channel interface -// - -STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, - int desired_channels); -STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, - int * channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc * stbi_load(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); -STBIDEF stbi_uc * stbi_load_from_file(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const * buffer, int len, int ** delays, int * x, int * y, int * z, - int * comp, int req_comp); -#endif - -#ifdef STBI_WINDOWS_UTF8 -STBIDEF int stbi_convert_wchar_to_utf8(char * buffer, size_t bufferlen, const wchar_t * input); -#endif - -//////////////////////////////////// -// -// 16-bits-per-channel interface -// - -STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, - int desired_channels); -STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, - int * channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_us * stbi_load_16(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); -STBIDEF stbi_us * stbi_load_from_file_16(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); -#endif - -//////////////////////////////////// -// -// float-per-channel interface -// -#ifndef STBI_NO_LINEAR -STBIDEF float * stbi_loadf_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, - int desired_channels); -STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * channels_in_file, - int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF float * stbi_loadf(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); -STBIDEF float * stbi_loadf_from_file(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); -#endif -#endif - -#ifndef STBI_NO_HDR -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); -STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif // STBI_NO_HDR - -#ifndef STBI_NO_LINEAR -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); -STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_LINEAR - -// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const * clbk, void * user); -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const * buffer, int len); -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr(char const * filename); -STBIDEF int stbi_is_hdr_from_file(FILE * f); -#endif // STBI_NO_STDIO - -// get a VERY brief reason for failure -// on most compilers (and ALL modern mainstream compilers) this is threadsafe -STBIDEF const char * stbi_failure_reason(void); - -// free the loaded image -- this is just free() -STBIDEF void stbi_image_free(void * retval_from_stbi_load); - -// get image dimensions & components without fully decoding -STBIDEF int stbi_info_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp); -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp); -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const * buffer, int len); -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const * clbk, void * user); - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const * filename, int * x, int * y, int * comp); -STBIDEF int stbi_info_from_file(FILE * f, int * x, int * y, int * comp); -STBIDEF int stbi_is_16_bit(char const * filename); -STBIDEF int stbi_is_16_bit_from_file(FILE * f); -#endif - -// for image formats that explicitly notate that they have premultiplied alpha, -// we just return the colors as stored in the file. set this flag to force -// unpremultiplication. results are undefined if the unpremultiply overflow. -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - -// indicate whether we should process iphone images back to canonical format, -// or just pass them through "as-is" -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - -// flip the image vertically, so the first pixel in the output array is the bottom left -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - -// as above, but only applies to images loaded on the thread that calls the function -// this function is only available if your compiler supports thread-local variables; -// calling it will fail to link if your compiler doesn't -STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); -STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); - -// ZLIB client - used by PNG, available for other purposes - -STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int * outlen); -STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char * buffer, int len, int initial_size, int * outlen, - int parse_header); -STBIDEF char * stbi_zlib_decode_malloc(const char * buffer, int len, int * outlen); -STBIDEF int stbi_zlib_decode_buffer(char * obuffer, int olen, const char * ibuffer, int ilen); - -STBIDEF char * stbi_zlib_decode_noheader_malloc(const char * buffer, int len, int * outlen); -STBIDEF int stbi_zlib_decode_noheader_buffer(char * obuffer, int olen, const char * ibuffer, int ilen); - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifdef STB_IMAGE_IMPLEMENTATION - -#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) || defined(STBI_ONLY_TGA) || \ - defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || \ - defined(STBI_ONLY_PNM) || defined(STBI_ONLY_ZLIB) -#ifndef STBI_ONLY_JPEG -#define STBI_NO_JPEG -#endif -#ifndef STBI_ONLY_PNG -#define STBI_NO_PNG -#endif -#ifndef STBI_ONLY_BMP -#define STBI_NO_BMP -#endif -#ifndef STBI_ONLY_PSD -#define STBI_NO_PSD -#endif -#ifndef STBI_ONLY_TGA -#define STBI_NO_TGA -#endif -#ifndef STBI_ONLY_GIF -#define STBI_NO_GIF -#endif -#ifndef STBI_ONLY_HDR -#define STBI_NO_HDR -#endif -#ifndef STBI_ONLY_PIC -#define STBI_NO_PIC -#endif -#ifndef STBI_ONLY_PNM -#define STBI_NO_PNM -#endif -#endif - -#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) -#define STBI_NO_ZLIB -#endif - -#include -#include -#include // ptrdiff_t on osx -#include -#include - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp, pow -#endif - -#ifndef STBI_NO_STDIO -#include -#endif - -#ifndef STBI_ASSERT -#include -#define STBI_ASSERT(x) assert(x) -#endif - -#ifdef __cplusplus -#define STBI_EXTERN extern "C" -#else -#define STBI_EXTERN extern -#endif - -#ifndef _MSC_VER -#ifdef __cplusplus -#define stbi_inline inline -#else -#define stbi_inline -#endif -#else -#define stbi_inline __forceinline -#endif - -#ifndef STBI_NO_THREAD_LOCALS -#if defined(__cplusplus) && __cplusplus >= 201103L -#define STBI_THREAD_LOCAL thread_local -#elif defined(__GNUC__) && __GNUC__ < 5 -#define STBI_THREAD_LOCAL __thread -#elif defined(_MSC_VER) -#define STBI_THREAD_LOCAL __declspec(thread) -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) -#define STBI_THREAD_LOCAL _Thread_local -#endif - -#ifndef STBI_THREAD_LOCAL -#if defined(__GNUC__) -#define STBI_THREAD_LOCAL __thread -#endif -#endif -#endif - -#if defined(_MSC_VER) || defined(__SYMBIAN32__) -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; -#else -#include -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; -#endif - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(stbi__uint32) == 4 ? 1 : -1]; - -#ifdef _MSC_VER -#define STBI_NOTUSED(v) (void)(v) -#else -#define STBI_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL -#define stbi_lrot(x, y) _lrotl(x, y) -#else -#define stbi_lrot(x, y) (((x) << (y)) | ((x) >> (-(y)&31))) -#endif - -#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -// ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." -#endif - -#ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p, newsz) realloc(p, newsz) -#define STBI_FREE(p) free(p) -#endif - -#ifndef STBI_REALLOC_SIZED -#define STBI_REALLOC_SIZED(p, oldsz, newsz) STBI_REALLOC(p, newsz) -#endif - -// x86/x64 detection -#if defined(__x86_64__) || defined(_M_X64) -#define STBI__X64_TARGET -#elif defined(__i386) || defined(_M_IX86) -#define STBI__X86_TARGET -#endif - -#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// which in turn means it gets to use SSE2 everywhere. This is unfortunate, -// but previous attempts to provide the SSE2 functions with runtime -// detection caused numerous issues. The way architecture extensions are -// exposed in GCC/Clang is, sadly, not really suited for one-file libs. -// New behavior: if compiled with -msse2, we use SSE2 without any -// detection; if not, we don't use it at all. -#define STBI_NO_SIMD -#endif - -#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) -// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET -// -// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the -// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. -// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not -// simultaneously enabling "-mstackrealign". -// -// See https://github.com/nothings/stb/issues/81 for more information. -// -// So default to no SSE2 on 32-bit MinGW. If you've read this far and added -// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. -#define STBI_NO_SIMD -#endif - -#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) -#define STBI_SSE2 -#include - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include // __cpuid -static int stbi__cpuid3(void) { - int info[4]; - __cpuid(info, 1); - return info[3]; -} -#else -static int stbi__cpuid3(void) { - int res; - __asm { - mov eax,1 - cpuid - mov res,edx - } - return res; -} -#endif - -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) { - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; -} -#endif - -#else // assume GCC-style if not VC++ -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) { - // If we're even attempting to compile this on GCC/Clang, that means - // -msse2 is on, which means the compiler is allowed to use SSE2 - // instructions at will, and so are we. - return 1; -} -#endif - -#endif -#endif - -// ARM NEON -#if defined(STBI_NO_SIMD) && defined(STBI_NEON) -#undef STBI_NEON -#endif - -#ifdef STBI_NEON -#include -#ifdef _MSC_VER -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -#else -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif -#endif - -#ifndef STBI_SIMD_ALIGN -#define STBI_SIMD_ALIGN(type, name) type name -#endif - -#ifndef STBI_MAX_DIMENSIONS -#define STBI_MAX_DIMENSIONS (1 << 24) -#endif - -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct { - stbi__uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void * io_user_data; - - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; - int callback_already_read; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -} stbi__context; - -static void stbi__refill_buffer(stbi__context * s); - -// initialize a memory-decode context -static void stbi__start_mem(stbi__context * s, stbi_uc const * buffer, int len) { - s->io.read = NULL; - s->read_from_callbacks = 0; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *)buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *)buffer + len; -} - -// initialize a callback-based context -static void stbi__start_callbacks(stbi__context * s, stbi_io_callbacks * c, void * user) { - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; -} - -#ifndef STBI_NO_STDIO - -static int stbi__stdio_read(void * user, char * data, int size) { return (int)fread(data, 1, size, (FILE *)user); } - -static void stbi__stdio_skip(void * user, int n) { - int ch; - fseek((FILE *)user, n, SEEK_CUR); - ch = fgetc((FILE *)user); /* have to read a byte to reset feof()'s flag */ - if (ch != EOF) { - ungetc(ch, (FILE *)user); /* push byte back onto stream if valid. */ - } -} - -static int stbi__stdio_eof(void * user) { return feof((FILE *)user) || ferror((FILE *)user); } - -static stbi_io_callbacks stbi__stdio_callbacks = { - stbi__stdio_read, - stbi__stdio_skip, - stbi__stdio_eof, -}; - -static void stbi__start_file(stbi__context * s, FILE * f) { stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *)f); } - -// static void stop_file(stbi__context *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi__rewind(stbi__context * s) { - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; - s->img_buffer_end = s->img_buffer_original_end; -} - -enum { STBI_ORDER_RGB, STBI_ORDER_BGR }; - -typedef struct { - int bits_per_channel; - int num_channels; - int channel_order; -} stbi__result_info; - -#ifndef STBI_NO_JPEG -static int stbi__jpeg_test(stbi__context * s); -static void * stbi__jpeg_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static int stbi__jpeg_info(stbi__context * s, int * x, int * y, int * comp); -#endif - -#ifndef STBI_NO_PNG -static int stbi__png_test(stbi__context * s); -static void * stbi__png_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static int stbi__png_info(stbi__context * s, int * x, int * y, int * comp); -static int stbi__png_is16(stbi__context * s); -#endif - -#ifndef STBI_NO_BMP -static int stbi__bmp_test(stbi__context * s); -static void * stbi__bmp_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static int stbi__bmp_info(stbi__context * s, int * x, int * y, int * comp); -#endif - -#ifndef STBI_NO_TGA -static int stbi__tga_test(stbi__context * s); -static void * stbi__tga_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static int stbi__tga_info(stbi__context * s, int * x, int * y, int * comp); -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context * s); -static void * stbi__psd_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, int bpc); -static int stbi__psd_info(stbi__context * s, int * x, int * y, int * comp); -static int stbi__psd_is16(stbi__context * s); -#endif - -#ifndef STBI_NO_HDR -static int stbi__hdr_test(stbi__context * s); -static float * stbi__hdr_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static int stbi__hdr_info(stbi__context * s, int * x, int * y, int * comp); -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_test(stbi__context * s); -static void * stbi__pic_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static int stbi__pic_info(stbi__context * s, int * x, int * y, int * comp); -#endif - -#ifndef STBI_NO_GIF -static int stbi__gif_test(stbi__context * s); -static void * stbi__gif_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static void * stbi__load_gif_main(stbi__context * s, int ** delays, int * x, int * y, int * z, int * comp, int req_comp); -static int stbi__gif_info(stbi__context * s, int * x, int * y, int * comp); -#endif - -#ifndef STBI_NO_PNM -static int stbi__pnm_test(stbi__context * s); -static void * stbi__pnm_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); -static int stbi__pnm_info(stbi__context * s, int * x, int * y, int * comp); -static int stbi__pnm_is16(stbi__context * s); -#endif - -static -#ifdef STBI_THREAD_LOCAL - STBI_THREAD_LOCAL -#endif - const char * stbi__g_failure_reason; - -STBIDEF const char * stbi_failure_reason(void) { return stbi__g_failure_reason; } - -#ifndef STBI_NO_FAILURE_STRINGS -static int stbi__err(const char * str) { - stbi__g_failure_reason = str; - return 0; -} -#endif - -static void * stbi__malloc(size_t size) { return STBI_MALLOC(size); } - -// stb_image uses ints pervasively, including for offset calculations. -// therefore the largest decoded image size we can support with the -// current code, even on 64-bit targets, is INT_MAX. this is not a -// significant limitation for the intended use case. -// -// we do, however, need to make sure our size calculations don't -// overflow. hence a few helper functions for size calculations that -// multiply integers together, making sure that they're non-negative -// and no overflow occurs. - -// return 1 if the sum is valid, 0 on overflow. -// negative terms are considered invalid. -static int stbi__addsizes_valid(int a, int b) { - if (b < 0) - return 0; - // now 0 <= b <= INT_MAX, hence also - // 0 <= INT_MAX - b <= INTMAX. - // And "a + b <= INT_MAX" (which might overflow) is the - // same as a <= INT_MAX - b (no overflow) - return a <= INT_MAX - b; -} - -// returns 1 if the product is valid, 0 on overflow. -// negative factors are considered invalid. -static int stbi__mul2sizes_valid(int a, int b) { - if (a < 0 || b < 0) - return 0; - if (b == 0) - return 1; // mul-by-0 is always safe - // portable way to check for no overflows in a*b - return a <= INT_MAX / b; -} - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow -static int stbi__mad2sizes_valid(int a, int b, int add) { - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a * b, add); -} -#endif - -// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow -static int stbi__mad3sizes_valid(int a, int b, int c, int add) { - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) && stbi__addsizes_valid(a * b * c, add); -} - -// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) -static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) { - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) && stbi__mul2sizes_valid(a * b * c, d) && - stbi__addsizes_valid(a * b * c * d, add); -} -#endif - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// mallocs with size overflow checking -static void * stbi__malloc_mad2(int a, int b, int add) { - if (!stbi__mad2sizes_valid(a, b, add)) - return NULL; - return stbi__malloc(a * b + add); -} -#endif - -static void * stbi__malloc_mad3(int a, int b, int c, int add) { - if (!stbi__mad3sizes_valid(a, b, c, add)) - return NULL; - return stbi__malloc(a * b * c + add); -} - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) -static void * stbi__malloc_mad4(int a, int b, int c, int d, int add) { - if (!stbi__mad4sizes_valid(a, b, c, d, add)) - return NULL; - return stbi__malloc(a * b * c * d + add); -} -#endif - -// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. -static int stbi__addints_valid(int a, int b) { - if ((a >= 0) != (b >= 0)) - return 1; // a and b have different signs, so no overflow - if (a < 0 && b < 0) - return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. - return a <= INT_MAX - b; -} - -// returns 1 if the product of two signed shorts is valid, 0 on overflow. -static int stbi__mul2shorts_valid(short a, short b) { - if (b == 0 || b == -1) - return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow - if ((a >= 0) == (b >= 0)) - return a <= SHRT_MAX / b; // product is positive, so similar to mul2sizes_valid - if (b < 0) - return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN - return a >= SHRT_MIN / b; -} - -// stbi__err - error -// stbi__errpf - error returning pointer to float -// stbi__errpuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS -#define stbi__err(x, y) 0 -#elif defined(STBI_FAILURE_USERMSG) -#define stbi__err(x, y) stbi__err(y) -#else -#define stbi__err(x, y) stbi__err(x) -#endif - -#define stbi__errpf(x, y) ((float *)(size_t)(stbi__err(x, y) ? NULL : NULL)) -#define stbi__errpuc(x, y) ((unsigned char *)(size_t)(stbi__err(x, y) ? NULL : NULL)) - -STBIDEF void stbi_image_free(void * retval_from_stbi_load) { STBI_FREE(retval_from_stbi_load); } - -#ifndef STBI_NO_LINEAR -static float * stbi__ldr_to_hdr(stbi_uc * data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_HDR -static stbi_uc * stbi__hdr_to_ldr(float * data, int x, int y, int comp); -#endif - -static int stbi__vertically_flip_on_load_global = 0; - -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) { - stbi__vertically_flip_on_load_global = flag_true_if_should_flip; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global -#else -static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; - -STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) { - stbi__vertically_flip_on_load_local = flag_true_if_should_flip; - stbi__vertically_flip_on_load_set = 1; -} - -#define stbi__vertically_flip_on_load \ - (stbi__vertically_flip_on_load_set ? stbi__vertically_flip_on_load_local : stbi__vertically_flip_on_load_global) -#endif // STBI_THREAD_LOCAL - -static void * stbi__load_main(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, int bpc) { - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields - ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - -// test the formats with a very explicit header first (at least a FOURCC -// or distinctive magic number first) -#ifndef STBI_NO_PNG - if (stbi__png_test(s)) - return stbi__png_load(s, x, y, comp, req_comp, ri); -#endif -#ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) - return stbi__bmp_load(s, x, y, comp, req_comp, ri); -#endif -#ifndef STBI_NO_GIF - if (stbi__gif_test(s)) - return stbi__gif_load(s, x, y, comp, req_comp, ri); -#endif -#ifndef STBI_NO_PSD - if (stbi__psd_test(s)) - return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc); -#else - STBI_NOTUSED(bpc); -#endif -#ifndef STBI_NO_PIC - if (stbi__pic_test(s)) - return stbi__pic_load(s, x, y, comp, req_comp, ri); -#endif - -// then the formats that can end up attempting to load with just 1 or 2 -// bytes matching expectations; these are prone to false positives, so -// try them later -#ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) - return stbi__jpeg_load(s, x, y, comp, req_comp, ri); -#endif -#ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) - return stbi__pnm_load(s, x, y, comp, req_comp, ri); -#endif - -#ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - float * hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri); - return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } -#endif - -#ifndef STBI_NO_TGA - // test tga last because it's a crappy test! - if (stbi__tga_test(s)) - return stbi__tga_load(s, x, y, comp, req_comp, ri); -#endif - - return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); -} - -static stbi_uc * stbi__convert_16_to_8(stbi__uint16 * orig, int w, int h, int channels) { - int i; - int img_len = w * h * channels; - stbi_uc * reduced; - - reduced = (stbi_uc *)stbi__malloc(img_len); - if (reduced == NULL) - return stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling - - STBI_FREE(orig); - return reduced; -} - -static stbi__uint16 * stbi__convert_8_to_16(stbi_uc * orig, int w, int h, int channels) { - int i; - int img_len = w * h * channels; - stbi__uint16 * enlarged; - - enlarged = (stbi__uint16 *)stbi__malloc(img_len * 2); - if (enlarged == NULL) - return (stbi__uint16 *)stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff - - STBI_FREE(orig); - return enlarged; -} - -static void stbi__vertical_flip(void * image, int w, int h, int bytes_per_pixel) { - int row; - size_t bytes_per_row = (size_t)w * bytes_per_pixel; - stbi_uc temp[2048]; - stbi_uc * bytes = (stbi_uc *)image; - - for (row = 0; row < (h >> 1); row++) { - stbi_uc * row0 = bytes + row * bytes_per_row; - stbi_uc * row1 = bytes + (h - row - 1) * bytes_per_row; - // swap row0 with row1 - size_t bytes_left = bytes_per_row; - while (bytes_left) { - size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); - memcpy(temp, row0, bytes_copy); - memcpy(row0, row1, bytes_copy); - memcpy(row1, temp, bytes_copy); - row0 += bytes_copy; - row1 += bytes_copy; - bytes_left -= bytes_copy; - } - } -} - -#ifndef STBI_NO_GIF -static void stbi__vertical_flip_slices(void * image, int w, int h, int z, int bytes_per_pixel) { - int slice; - int slice_size = w * h * bytes_per_pixel; - - stbi_uc * bytes = (stbi_uc *)image; - for (slice = 0; slice < z; ++slice) { - stbi__vertical_flip(bytes, w, h, bytes_per_pixel); - bytes += slice_size; - } -} -#endif - -static unsigned char * stbi__load_and_postprocess_8bit(stbi__context * s, int * x, int * y, int * comp, int req_comp) { - stbi__result_info ri; - void * result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 8) { - result = stbi__convert_16_to_8((stbi__uint16 *)result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } - - // @TODO: move stbi__convert_format to here - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); - } - - return (unsigned char *)result; -} - -static stbi__uint16 * stbi__load_and_postprocess_16bit(stbi__context * s, int * x, int * y, int * comp, int req_comp) { - stbi__result_info ri; - void * result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 16) { - result = stbi__convert_8_to_16((stbi_uc *)result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } - - // @TODO: move stbi__convert_format16 to here - // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); - } - - return (stbi__uint16 *)result; -} - -#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) -static void stbi__float_postprocess(float * result, int * x, int * y, int * comp, int req_comp) { - if (stbi__vertically_flip_on_load && result != NULL) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); - } -} -#endif - -#ifndef STBI_NO_STDIO - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char * str, - int cbmb, wchar_t * widestr, int cchwide); -STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, - const wchar_t * widestr, int cchwide, char * str, int cbmb, - const char * defchar, int * used_default); -#endif - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBIDEF int stbi_convert_wchar_to_utf8(char * buffer, size_t bufferlen, const wchar_t * input) { - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int)bufferlen, NULL, NULL); -} -#endif - -static FILE * stbi__fopen(char const * filename, char const * mode) { - FILE * f; -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename) / sizeof(*wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode) / sizeof(*wMode))) - return 0; - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f = 0; -#else - f = fopen(filename, mode); -#endif - return f; -} - -STBIDEF stbi_uc * stbi_load(char const * filename, int * x, int * y, int * comp, int req_comp) { - FILE * f = stbi__fopen(filename, "rb"); - unsigned char * result; - if (!f) - return stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f, x, y, comp, req_comp); - fclose(f); - return result; -} - -STBIDEF stbi_uc * stbi_load_from_file(FILE * f, int * x, int * y, int * comp, int req_comp) { - unsigned char * result; - stbi__context s; - stbi__start_file(&s, f); - result = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, -(int)(s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi__uint16 * stbi_load_from_file_16(FILE * f, int * x, int * y, int * comp, int req_comp) { - stbi__uint16 * result; - stbi__context s; - stbi__start_file(&s, f); - result = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, -(int)(s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi_us * stbi_load_16(char const * filename, int * x, int * y, int * comp, int req_comp) { - FILE * f = stbi__fopen(filename, "rb"); - stbi__uint16 * result; - if (!f) - return (stbi_us *)stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file_16(f, x, y, comp, req_comp); - fclose(f); - return result; -} - -#endif //! STBI_NO_STDIO - -STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, - int desired_channels) { - stbi__context s; - stbi__start_mem(&s, buffer, len); - return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels); -} - -STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, - int * channels_in_file, int desired_channels) { - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels); -} - -STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp, int req_comp) { - stbi__context s; - stbi__start_mem(&s, buffer, len); - return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); -} - -STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp, - int req_comp) { - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); -} - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const * buffer, int len, int ** delays, int * x, int * y, int * z, - int * comp, int req_comp) { - unsigned char * result; - stbi__context s; - stbi__start_mem(&s, buffer, len); - - result = (unsigned char *)stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); - if (stbi__vertically_flip_on_load) { - stbi__vertical_flip_slices(result, *x, *y, *z, *comp); - } - - return result; -} -#endif - -#ifndef STBI_NO_LINEAR -static float * stbi__loadf_main(stbi__context * s, int * x, int * y, int * comp, int req_comp) { - unsigned char * data; -#ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - stbi__result_info ri; - float * hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri); - if (hdr_data) - stbi__float_postprocess(hdr_data, x, y, comp, req_comp); - return hdr_data; - } -#endif - data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); - if (data) - return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); -} - -STBIDEF float * stbi_loadf_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp, int req_comp) { - stbi__context s; - stbi__start_mem(&s, buffer, len); - return stbi__loadf_main(&s, x, y, comp, req_comp); -} - -STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp, - int req_comp) { - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__loadf_main(&s, x, y, comp, req_comp); -} - -#ifndef STBI_NO_STDIO -STBIDEF float * stbi_loadf(char const * filename, int * x, int * y, int * comp, int req_comp) { - float * result; - FILE * f = stbi__fopen(filename, "rb"); - if (!f) - return stbi__errpf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f, x, y, comp, req_comp); - fclose(f); - return result; -} - -STBIDEF float * stbi_loadf_from_file(FILE * f, int * x, int * y, int * comp, int req_comp) { - stbi__context s; - stbi__start_file(&s, f); - return stbi__loadf_main(&s, x, y, comp, req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_LINEAR - -// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is -// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always -// reports false! - -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const * buffer, int len) { -#ifndef STBI_NO_HDR - stbi__context s; - stbi__start_mem(&s, buffer, len); - return stbi__hdr_test(&s); -#else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; -#endif -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr(char const * filename) { - FILE * f = stbi__fopen(filename, "rb"); - int result = 0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -STBIDEF int stbi_is_hdr_from_file(FILE * f) { -#ifndef STBI_NO_HDR - long pos = ftell(f); - int res; - stbi__context s; - stbi__start_file(&s, f); - res = stbi__hdr_test(&s); - fseek(f, pos, SEEK_SET); - return res; -#else - STBI_NOTUSED(f); - return 0; -#endif -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const * clbk, void * user) { -#ifndef STBI_NO_HDR - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__hdr_test(&s); -#else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); - return 0; -#endif -} - -#ifndef STBI_NO_LINEAR -static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f; - -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } -#endif - -static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f; - -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1 / gamma; } -STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1 / scale; } - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum { STBI__SCAN_load = 0, STBI__SCAN_type, STBI__SCAN_header }; - -static void stbi__refill_buffer(stbi__context * s) { - int n = (s->io.read)(s->io_user_data, (char *)s->buffer_start, s->buflen); - s->callback_already_read += (int)(s->img_buffer - s->img_buffer_original); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file - s->read_from_callbacks = 0; - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + 1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static stbi_uc stbi__get8(stbi__context * s) { - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - stbi__refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -stbi_inline static int stbi__at_eof(stbi__context * s) { - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) - return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) - return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && \ - defined(STBI_NO_GIF) && defined(STBI_NO_PIC) -// nothing -#else -static void stbi__skip(stbi__context * s, int n) { - if (n == 0) - return; // already there! - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; - } - if (s->io.read) { - int blen = (int)(s->img_buffer_end - s->img_buffer); - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) -// nothing -#else -static int stbi__getn(stbi__context * s, stbi_uc * buffer, int n) { - if (s->io.read) { - int blen = (int)(s->img_buffer_end - s->img_buffer); - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char *)buffer + blen, n - blen); - res = (count == (n - blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer + n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static int stbi__get16be(stbi__context * s) { - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static stbi__uint32 stbi__get32be(stbi__context * s) { - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); -} -#endif - -#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) -// nothing -#else -static int stbi__get16le(stbi__context * s) { - int z = stbi__get8(s); - return z + (stbi__get8(s) << 8); -} -#endif - -#ifndef STBI_NO_BMP -static stbi__uint32 stbi__get32le(stbi__context * s) { - stbi__uint32 z = stbi__get16le(s); - z += (stbi__uint32)stbi__get16le(s) << 16; - return z; -} -#endif - -#define STBI__BYTECAST(x) ((stbi_uc)((x)&255)) // truncate int to byte without warnings - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && \ - defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static stbi_uc stbi__compute_y(int r, int g, int b) { return (stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8); } -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && \ - defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -static unsigned char * stbi__convert_format(unsigned char * data, int img_n, int req_comp, unsigned int x, unsigned int y) { - int i, j; - unsigned char * good; - - if (req_comp == img_n) - return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *)stbi__malloc_mad3(req_comp, x, y, 0); - if (good == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - - for (j = 0; j < (int)y; ++j) { - unsigned char * src = data + j * x * img_n; - unsigned char * dest = good + j * x * req_comp; - -#define STBI__COMBO(a, b) ((a)*8 + (b)) -#define STBI__CASE(a, b) \ - case STBI__COMBO(a, b): \ - for (i = x - 1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1, 2) { - dest[0] = src[0]; - dest[1] = 255; - } - break; - STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; } - break; - STBI__CASE(1, 4) { - dest[0] = dest[1] = dest[2] = src[0]; - dest[3] = 255; - } - break; - STBI__CASE(2, 1) { dest[0] = src[0]; } - break; - STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; } - break; - STBI__CASE(2, 4) { - dest[0] = dest[1] = dest[2] = src[0]; - dest[3] = src[1]; - } - break; - STBI__CASE(3, 4) { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - dest[3] = 255; - } - break; - STBI__CASE(3, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); } - break; - STBI__CASE(3, 2) { - dest[0] = stbi__compute_y(src[0], src[1], src[2]); - dest[1] = 255; - } - break; - STBI__CASE(4, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); } - break; - STBI__CASE(4, 2) { - dest[0] = stbi__compute_y(src[0], src[1], src[2]); - dest[1] = src[3]; - } - break; - STBI__CASE(4, 3) { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - } - break; - default: - STBI_ASSERT(0); - STBI_FREE(data); - STBI_FREE(good); - return stbi__errpuc("unsupported", "Unsupported format conversion"); - } -#undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 stbi__compute_y_16(int r, int g, int b) { return (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8); } -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 * stbi__convert_format16(stbi__uint16 * data, int img_n, int req_comp, unsigned int x, unsigned int y) { - int i, j; - stbi__uint16 * good; - - if (req_comp == img_n) - return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (stbi__uint16 *)stbi__malloc(req_comp * x * y * 2); - if (good == NULL) { - STBI_FREE(data); - return (stbi__uint16 *)stbi__errpuc("outofmem", "Out of memory"); - } - - for (j = 0; j < (int)y; ++j) { - stbi__uint16 * src = data + j * x * img_n; - stbi__uint16 * dest = good + j * x * req_comp; - -#define STBI__COMBO(a, b) ((a)*8 + (b)) -#define STBI__CASE(a, b) \ - case STBI__COMBO(a, b): \ - for (i = x - 1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1, 2) { - dest[0] = src[0]; - dest[1] = 0xffff; - } - break; - STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; } - break; - STBI__CASE(1, 4) { - dest[0] = dest[1] = dest[2] = src[0]; - dest[3] = 0xffff; - } - break; - STBI__CASE(2, 1) { dest[0] = src[0]; } - break; - STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; } - break; - STBI__CASE(2, 4) { - dest[0] = dest[1] = dest[2] = src[0]; - dest[3] = src[1]; - } - break; - STBI__CASE(3, 4) { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - dest[3] = 0xffff; - } - break; - STBI__CASE(3, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); } - break; - STBI__CASE(3, 2) { - dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); - dest[1] = 0xffff; - } - break; - STBI__CASE(4, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); } - break; - STBI__CASE(4, 2) { - dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); - dest[1] = src[3]; - } - break; - STBI__CASE(4, 3) { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - } - break; - default: - STBI_ASSERT(0); - STBI_FREE(data); - STBI_FREE(good); - return (stbi__uint16 *)stbi__errpuc("unsupported", "Unsupported format conversion"); - } -#undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#ifndef STBI_NO_LINEAR -static float * stbi__ldr_to_hdr(stbi_uc * data, int x, int y, int comp) { - int i, k, n; - float * output; - if (!data) - return NULL; - output = (float *)stbi__malloc_mad4(x, y, comp, sizeof(float), 0); - if (output == NULL) { - STBI_FREE(data); - return stbi__errpf("outofmem", "Out of memory"); - } - // compute number of non-alpha components - if (comp & 1) - n = comp; - else - n = comp - 1; - for (i = 0; i < x * y; ++i) { - for (k = 0; k < n; ++k) { - output[i * comp + k] = (float)(pow(data[i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } - } - if (n < comp) { - for (i = 0; i < x * y; ++i) { - output[i * comp + n] = data[i * comp + n] / 255.0f; - } - } - STBI_FREE(data); - return output; -} -#endif - -#ifndef STBI_NO_HDR -#define stbi__float2int(x) ((int)(x)) -static stbi_uc * stbi__hdr_to_ldr(float * data, int x, int y, int comp) { - int i, k, n; - stbi_uc * output; - if (!data) - return NULL; - output = (stbi_uc *)stbi__malloc_mad3(x, y, comp, 0); - if (output == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - // compute number of non-alpha components - if (comp & 1) - n = comp; - else - n = comp - 1; - for (i = 0; i < x * y; ++i) { - for (k = 0; k < n; ++k) { - float z = (float)pow(data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; - if (z < 0) - z = 0; - if (z > 255) - z = 255; - output[i * comp + k] = (stbi_uc)stbi__float2int(z); - } - if (k < comp) { - float z = data[i * comp + k] * 255 + 0.5f; - if (z < 0) - z = 0; - if (z > 255) - z = 255; - output[i * comp + k] = (stbi_uc)stbi__float2int(z); - } - } - STBI_FREE(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder -// -// simple implementation -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - some SIMD kernels for common paths on targets with SSE2/NEON -// - uses a lot of intermediate memory, could cache poorly - -#ifndef STBI_NO_JPEG - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct { - stbi_uc fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - stbi__uint16 code[256]; - stbi_uc values[256]; - stbi_uc size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} stbi__huffman; - -typedef struct { - stbi__context * s; - stbi__huffman huff_dc[4]; - stbi__huffman huff_ac[4]; - stbi__uint16 dequant[4][64]; - stbi__int16 fast_ac[4][1 << FAST_BITS]; - - // sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - - // definition of jpeg image component - struct { - int id; - int h, v; - int tq; - int hd, ha; - int dc_pred; - - int x, y, w2, h2; - stbi_uc * data; - void *raw_data, *raw_coeff; - stbi_uc * linebuf; - short * coeff; // progressive only - int coeff_w, coeff_h; // number of 8x8 coefficient blocks - } img_comp[4]; - - stbi__uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int progressive; - int spec_start; - int spec_end; - int succ_high; - int succ_low; - int eob_run; - int jfif; - int app14_color_transform; // Adobe APP14 tag - int rgb; - - int scan_n, order[4]; - int restart_interval, todo; - - // kernels - void (*idct_block_kernel)(stbi_uc * out, int out_stride, short data[64]); - void (*YCbCr_to_RGB_kernel)(stbi_uc * out, const stbi_uc * y, const stbi_uc * pcb, const stbi_uc * pcr, int count, - int step); - stbi_uc * (*resample_row_hv_2_kernel)(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs); -} stbi__jpeg; - -static int stbi__build_huffman(stbi__huffman * h, int * count) { - int i, j, k = 0; - unsigned int code; - // build size list for each symbol (from JPEG spec) - for (i = 0; i < 16; ++i) { - for (j = 0; j < count[i]; ++j) { - h->size[k++] = (stbi_uc)(i + 1); - if (k >= 257) - return stbi__err("bad size list", "Corrupt JPEG"); - } - } - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for (j = 1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (stbi__uint16)(code++); - if (code - 1 >= (1u << j)) - return stbi__err("bad code lengths", "Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16 - j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i = 0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS - s); - int m = 1 << (FAST_BITS - s); - for (j = 0; j < m; ++j) { - h->fast[c + j] = (stbi_uc)i; - } - } - } - return 1; -} - -// build a table that decodes both magnitude and value of small ACs in -// one go. -static void stbi__build_fast_ac(stbi__int16 * fast_ac, stbi__huffman * h) { - int i; - for (i = 0; i < (1 << FAST_BITS); ++i) { - stbi_uc fast = h->fast[i]; - fast_ac[i] = 0; - if (fast < 255) { - int rs = h->values[fast]; - int run = (rs >> 4) & 15; - int magbits = rs & 15; - int len = h->size[fast]; - - if (magbits && len + magbits <= FAST_BITS) { - // magnitude code followed by receive_extend code - int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); - int m = 1 << (magbits - 1); - if (k < m) - k += (~0U << magbits) + 1; - // if the result is small enough, we can fit it in fast_ac table - if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16)((k * 256) + (run * 16) + (len + magbits)); - } - } - } -} - -static void stbi__grow_buffer_unsafe(stbi__jpeg * j) { - do { - unsigned int b = j->nomore ? 0 : stbi__get8(j->s); - if (b == 0xff) { - int c = stbi__get8(j->s); - while (c == 0xff) - c = stbi__get8(j->s); // consume fill bytes - if (c != 0) { - j->marker = (unsigned char)c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static const stbi__uint32 stbi__bmask[17] = {0, 1, 3, 7, 15, 31, 63, 127, 255, - 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg * j, stbi__huffman * h) { - unsigned int temp; - int c, k; - - if (j->code_bits < 16) - stbi__grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k = FAST_BITS + 1;; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - if (c < 0 || c >= 256) // symbol id out of bounds! - return -1; - STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// bias[n] = (-1<code_bits < n) - stbi__grow_buffer_unsafe(j); - if (j->code_bits < n) - return 0; // ran out of bits from stream, return 0s intead of continuing - - sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k + (stbi__jbias[n] & (sgn - 1)); -} - -// get some unsigned bits -stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg * j, int n) { - unsigned int k; - if (j->code_bits < n) - stbi__grow_buffer_unsafe(j); - if (j->code_bits < n) - return 0; // ran out of bits from stream, return 0s intead of continuing - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k; -} - -stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg * j) { - unsigned int k; - if (j->code_bits < 1) - stbi__grow_buffer_unsafe(j); - if (j->code_bits < 1) - return 0; // ran out of bits from stream, return 0s intead of continuing - k = j->code_buffer; - j->code_buffer <<= 1; - --j->code_bits; - return k & 0x80000000; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static const stbi_uc stbi__jpeg_dezigzag[64 + 15] = { - 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, - 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; - -// decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg * j, short data[64], stbi__huffman * hdc, stbi__huffman * hac, stbi__int16 * fac, - int b, stbi__uint16 * dequant) { - int diff, dc, k; - int t; - - if (j->code_bits < 16) - stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) - return stbi__err("bad huffman code", "Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data, 0, 64 * sizeof(data[0])); - - diff = t ? stbi__extend_receive(j, t) : 0; - if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) - return stbi__err("bad delta", "Corrupt JPEG"); - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - if (!stbi__mul2shorts_valid(dc, dequant[0])) - return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - data[0] = (short)(dc * dequant[0]); - - // decode AC components, see JPEG spec - k = 1; - do { - unsigned int zig; - int c, r, s; - if (j->code_bits < 16) - stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - if (s > j->code_bits) - return stbi__err("bad huffman code", "Combined length longer than code bits available"); - j->code_buffer <<= s; - j->code_bits -= s; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short)((r >> 8) * dequant[zig]); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) - return stbi__err("bad huffman code", "Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) - break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]); - } - } - } while (k < 64); - return 1; -} - -static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg * j, short data[64], stbi__huffman * hdc, int b) { - int diff, dc; - int t; - if (j->spec_end != 0) - return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->code_bits < 16) - stbi__grow_buffer_unsafe(j); - - if (j->succ_high == 0) { - // first scan for DC coefficient, must be first - memset(data, 0, 64 * sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) - return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - diff = t ? stbi__extend_receive(j, t) : 0; - - if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) - return stbi__err("bad delta", "Corrupt JPEG"); - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) - return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - data[0] = (short)(dc * (1 << j->succ_low)); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) - data[0] += (short)(1 << j->succ_low); - } - return 1; -} - -// @OPTIMIZE: store non-zigzagged during the decode passes, -// and only de-zigzag when dequantizing -static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg * j, short data[64], stbi__huffman * hac, stbi__int16 * fac) { - int k; - if (j->spec_start == 0) - return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->succ_high == 0) { - int shift = j->succ_low; - - if (j->eob_run) { - --j->eob_run; - return 1; - } - - k = j->spec_start; - do { - unsigned int zig; - int c, r, s; - if (j->code_bits < 16) - stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - if (s > j->code_bits) - return stbi__err("bad huffman code", "Combined length longer than code bits available"); - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short)((r >> 8) * (1 << shift)); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) - return stbi__err("bad huffman code", "Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r); - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - --j->eob_run; - break; - } - k += 16; - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short)(stbi__extend_receive(j, s) * (1 << shift)); - } - } - } while (k <= j->spec_end); - } else { - // refinement scan for these AC coefficients - - short bit = (short)(1 << j->succ_low); - - if (j->eob_run) { - --j->eob_run; - for (k = j->spec_start; k <= j->spec_end; ++k) { - short * p = &data[stbi__jpeg_dezigzag[k]]; - if (*p != 0) - if (stbi__jpeg_get_bit(j)) - if ((*p & bit) == 0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } - } else { - k = j->spec_start; - do { - int r, s; - int rs = stbi__jpeg_huff_decode( - j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh - if (rs < 0) - return stbi__err("bad huffman code", "Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r) - 1; - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - r = 64; // force end of block - } else { - // r=15 s=0 should write 16 0s, so we just do - // a run of 15 0s and then write s (which is 0), - // so we don't have to do anything special here - } - } else { - if (s != 1) - return stbi__err("bad huffman code", "Corrupt JPEG"); - // sign bit - if (stbi__jpeg_get_bit(j)) - s = bit; - else - s = -bit; - } - - // advance by r - while (k <= j->spec_end) { - short * p = &data[stbi__jpeg_dezigzag[k++]]; - if (*p != 0) { - if (stbi__jpeg_get_bit(j)) - if ((*p & bit) == 0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } else { - if (r == 0) { - *p = (short)s; - break; - } - --r; - } - } - } while (k <= j->spec_end); - } - } - return 1; -} - -// take a -128..127 value and stbi__clamp it and convert to 0..255 -stbi_inline static stbi_uc stbi__clamp(int x) { - // trick to use a single test to catch both cases - if ((unsigned int)x > 255) { - if (x < 0) - return 0; - if (x > 255) - return 255; - } - return (stbi_uc)x; -} - -#define stbi__f2f(x) ((int)(((x)*4096 + 0.5))) -#define stbi__fsh(x) ((x)*4096) - -// derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0, s1, s2, s3, s4, s5, s6, s7) \ - int t0, t1, t2, t3, p1, p2, p3, p4, p5, x0, x1, x2, x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2 + p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3 * stbi__f2f(-1.847759065f); \ - t3 = p1 + p2 * stbi__f2f(0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = stbi__fsh(p2 + p3); \ - t1 = stbi__fsh(p2 - p3); \ - x0 = t0 + t3; \ - x3 = t0 - t3; \ - x1 = t1 + t2; \ - x2 = t1 - t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0 + t2; \ - p4 = t1 + t3; \ - p1 = t0 + t3; \ - p2 = t1 + t2; \ - p5 = (p3 + p4) * stbi__f2f(1.175875602f); \ - t0 = t0 * stbi__f2f(0.298631336f); \ - t1 = t1 * stbi__f2f(2.053119869f); \ - t2 = t2 * stbi__f2f(3.072711026f); \ - t3 = t3 * stbi__f2f(1.501321110f); \ - p1 = p5 + p1 * stbi__f2f(-0.899976223f); \ - p2 = p5 + p2 * stbi__f2f(-2.562915447f); \ - p3 = p3 * stbi__f2f(-1.961570560f); \ - p4 = p4 * stbi__f2f(-0.390180644f); \ - t3 += p1 + p4; \ - t2 += p2 + p3; \ - t1 += p2 + p4; \ - t0 += p1 + p3; - -static void stbi__idct_block(stbi_uc * out, int out_stride, short data[64]) { - int i, val[64], *v = val; - stbi_uc * o; - short * d = data; - - // columns - for (i = 0; i < 8; ++i, ++d, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0 && d[40] == 0 && d[48] == 0 && d[56] == 0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0] * 4; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; - x1 += 512; - x2 += 512; - x3 += 512; - v[0] = (x0 + t3) >> 10; - v[56] = (x0 - t3) >> 10; - v[8] = (x1 + t2) >> 10; - v[48] = (x1 - t2) >> 10; - v[16] = (x2 + t1) >> 10; - v[40] = (x2 - t1) >> 10; - v[24] = (x3 + t0) >> 10; - v[32] = (x3 - t0) >> 10; - } - } - - for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) { - // no fast case since the first 1D IDCT spread components out - STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128 << 17); - x1 += 65536 + (128 << 17); - x2 += 65536 + (128 << 17); - x3 += 65536 + (128 << 17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = stbi__clamp((x0 + t3) >> 17); - o[7] = stbi__clamp((x0 - t3) >> 17); - o[1] = stbi__clamp((x1 + t2) >> 17); - o[6] = stbi__clamp((x1 - t2) >> 17); - o[2] = stbi__clamp((x2 + t1) >> 17); - o[5] = stbi__clamp((x2 - t1) >> 17); - o[3] = stbi__clamp((x3 + t0) >> 17); - o[4] = stbi__clamp((x3 - t0) >> 17); - } -} - -#ifdef STBI_SSE2 -// sse2 integer IDCT. not the fastest possible implementation but it -// produces bit-identical results to the generic C version so it's -// fully "transparent". -static void stbi__idct_simd(stbi_uc * out, int out_stride, short data[64]) { - // This is constructed to match our regular (generic) integer IDCT exactly. - __m128i row0, row1, row2, row3, row4, row5, row6, row7; - __m128i tmp; - -// dot product constant: even elems=x, odd elems=y -#define dct_const(x, y) _mm_setr_epi16((x), (y), (x), (y), (x), (y), (x), (y)) - -// out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) -// out(1) = c1[even]*x + c1[odd]*y -#define dct_rot(out0, out1, x, y, c0, c1) \ - __m128i c0##lo = _mm_unpacklo_epi16((x), (y)); \ - __m128i c0##hi = _mm_unpackhi_epi16((x), (y)); \ - __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ - __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ - __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ - __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) - -// out = in << 12 (in 16-bit, out 32-bit) -#define dct_widen(out, in) \ - __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ - __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) - -// wide add -#define dct_wadd(out, a, b) \ - __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_add_epi32(a##_h, b##_h) - -// wide sub -#define dct_wsub(out, a, b) \ - __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) - -// butterfly a/b, add bias, then shift by "s" and pack -#define dct_bfly32o(out0, out1, a, b, bias, s) \ - { \ - __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ - __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ - dct_wadd(sum, abiased, b); \ - dct_wsub(dif, abiased, b); \ - out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ - out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ - } - -// 8-bit interleave step (for transposes) -#define dct_interleave8(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi8(a, b); \ - b = _mm_unpackhi_epi8(tmp, b) - -// 16-bit interleave step (for transposes) -#define dct_interleave16(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi16(a, b); \ - b = _mm_unpackhi_epi16(tmp, b) - -#define dct_pass(bias, shift) \ - { \ - /* even part */ \ - dct_rot(t2e, t3e, row2, row6, rot0_0, rot0_1); \ - __m128i sum04 = _mm_add_epi16(row0, row4); \ - __m128i dif04 = _mm_sub_epi16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - dct_rot(y0o, y2o, row7, row3, rot2_0, rot2_1); \ - dct_rot(y1o, y3o, row5, row1, rot3_0, rot3_1); \ - __m128i sum17 = _mm_add_epi16(row1, row7); \ - __m128i sum35 = _mm_add_epi16(row3, row5); \ - dct_rot(y4o, y5o, sum17, sum35, rot1_0, rot1_1); \ - dct_wadd(x4, y0o, y4o); \ - dct_wadd(x5, y1o, y5o); \ - dct_wadd(x6, y2o, y5o); \ - dct_wadd(x7, y3o, y4o); \ - dct_bfly32o(row0, row7, x0, x7, bias, shift); \ - dct_bfly32o(row1, row6, x1, x6, bias, shift); \ - dct_bfly32o(row2, row5, x2, x5, bias, shift); \ - dct_bfly32o(row3, row4, x3, x4, bias, shift); \ - } - - __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); - __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f)); - __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); - __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); - __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f)); - __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f)); - __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f)); - __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f)); - - // rounding biases in column/row passes, see stbi__idct_block for explanation. - __m128i bias_0 = _mm_set1_epi32(512); - __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17)); - - // load - row0 = _mm_load_si128((const __m128i *)(data + 0 * 8)); - row1 = _mm_load_si128((const __m128i *)(data + 1 * 8)); - row2 = _mm_load_si128((const __m128i *)(data + 2 * 8)); - row3 = _mm_load_si128((const __m128i *)(data + 3 * 8)); - row4 = _mm_load_si128((const __m128i *)(data + 4 * 8)); - row5 = _mm_load_si128((const __m128i *)(data + 5 * 8)); - row6 = _mm_load_si128((const __m128i *)(data + 6 * 8)); - row7 = _mm_load_si128((const __m128i *)(data + 7 * 8)); - - // column pass - dct_pass(bias_0, 10); - - { - // 16bit 8x8 transpose pass 1 - dct_interleave16(row0, row4); - dct_interleave16(row1, row5); - dct_interleave16(row2, row6); - dct_interleave16(row3, row7); - - // transpose pass 2 - dct_interleave16(row0, row2); - dct_interleave16(row1, row3); - dct_interleave16(row4, row6); - dct_interleave16(row5, row7); - - // transpose pass 3 - dct_interleave16(row0, row1); - dct_interleave16(row2, row3); - dct_interleave16(row4, row5); - dct_interleave16(row6, row7); - } - - // row pass - dct_pass(bias_1, 17); - - { - // pack - __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 - __m128i p1 = _mm_packus_epi16(row2, row3); - __m128i p2 = _mm_packus_epi16(row4, row5); - __m128i p3 = _mm_packus_epi16(row6, row7); - - // 8bit 8x8 transpose pass 1 - dct_interleave8(p0, p2); // a0e0a1e1... - dct_interleave8(p1, p3); // c0g0c1g1... - - // transpose pass 2 - dct_interleave8(p0, p1); // a0c0e0g0... - dct_interleave8(p2, p3); // b0d0f0h0... - - // transpose pass 3 - dct_interleave8(p0, p2); // a0b0c0d0... - dct_interleave8(p1, p3); // a4b4c4d4... - - // store - _mm_storel_epi64((__m128i *)out, p0); - out += out_stride; - _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p0, 0x4e)); - out += out_stride; - _mm_storel_epi64((__m128i *)out, p2); - out += out_stride; - _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p2, 0x4e)); - out += out_stride; - _mm_storel_epi64((__m128i *)out, p1); - out += out_stride; - _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p1, 0x4e)); - out += out_stride; - _mm_storel_epi64((__m128i *)out, p3); - out += out_stride; - _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p3, 0x4e)); - } - -#undef dct_const -#undef dct_rot -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_interleave8 -#undef dct_interleave16 -#undef dct_pass -} - -#endif // STBI_SSE2 - -#ifdef STBI_NEON - -// NEON integer IDCT. should produce bit-identical -// results to the generic C version. -static void stbi__idct_simd(stbi_uc * out, int out_stride, short data[64]) { - int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; - - int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); - int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); - int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f)); - int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f)); - int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); - int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); - int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); - int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); - int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f)); - int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f)); - int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f)); - int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f)); - -#define dct_long_mul(out, inq, coeff) \ - int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) - -#define dct_long_mac(out, acc, inq, coeff) \ - int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) - -#define dct_widen(out, inq) \ - int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ - int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) - -// wide add -#define dct_wadd(out, a, b) \ - int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vaddq_s32(a##_h, b##_h) - -// wide sub -#define dct_wsub(out, a, b) \ - int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vsubq_s32(a##_h, b##_h) - -// butterfly a/b, then shift using "shiftop" by "s" and pack -#define dct_bfly32o(out0, out1, a, b, shiftop, s) \ - { \ - dct_wadd(sum, a, b); \ - dct_wsub(dif, a, b); \ - out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ - out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ - } - -#define dct_pass(shiftop, shift) \ - { \ - /* even part */ \ - int16x8_t sum26 = vaddq_s16(row2, row6); \ - dct_long_mul(p1e, sum26, rot0_0); \ - dct_long_mac(t2e, p1e, row6, rot0_1); \ - dct_long_mac(t3e, p1e, row2, rot0_2); \ - int16x8_t sum04 = vaddq_s16(row0, row4); \ - int16x8_t dif04 = vsubq_s16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - int16x8_t sum15 = vaddq_s16(row1, row5); \ - int16x8_t sum17 = vaddq_s16(row1, row7); \ - int16x8_t sum35 = vaddq_s16(row3, row5); \ - int16x8_t sum37 = vaddq_s16(row3, row7); \ - int16x8_t sumodd = vaddq_s16(sum17, sum35); \ - dct_long_mul(p5o, sumodd, rot1_0); \ - dct_long_mac(p1o, p5o, sum17, rot1_1); \ - dct_long_mac(p2o, p5o, sum35, rot1_2); \ - dct_long_mul(p3o, sum37, rot2_0); \ - dct_long_mul(p4o, sum15, rot2_1); \ - dct_wadd(sump13o, p1o, p3o); \ - dct_wadd(sump24o, p2o, p4o); \ - dct_wadd(sump23o, p2o, p3o); \ - dct_wadd(sump14o, p1o, p4o); \ - dct_long_mac(x4, sump13o, row7, rot3_0); \ - dct_long_mac(x5, sump24o, row5, rot3_1); \ - dct_long_mac(x6, sump23o, row3, rot3_2); \ - dct_long_mac(x7, sump14o, row1, rot3_3); \ - dct_bfly32o(row0, row7, x0, x7, shiftop, shift); \ - dct_bfly32o(row1, row6, x1, x6, shiftop, shift); \ - dct_bfly32o(row2, row5, x2, x5, shiftop, shift); \ - dct_bfly32o(row3, row4, x3, x4, shiftop, shift); \ - } - - // load - row0 = vld1q_s16(data + 0 * 8); - row1 = vld1q_s16(data + 1 * 8); - row2 = vld1q_s16(data + 2 * 8); - row3 = vld1q_s16(data + 3 * 8); - row4 = vld1q_s16(data + 4 * 8); - row5 = vld1q_s16(data + 5 * 8); - row6 = vld1q_s16(data + 6 * 8); - row7 = vld1q_s16(data + 7 * 8); - - // add DC bias - row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); - - // column pass - dct_pass(vrshrn_n_s32, 10); - - // 16bit 8x8 transpose - { -// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. -// whether compilers actually get this is another story, sadly. -#define dct_trn16(x, y) \ - { \ - int16x8x2_t t = vtrnq_s16(x, y); \ - x = t.val[0]; \ - y = t.val[1]; \ - } -#define dct_trn32(x, y) \ - { \ - int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); \ - x = vreinterpretq_s16_s32(t.val[0]); \ - y = vreinterpretq_s16_s32(t.val[1]); \ - } -#define dct_trn64(x, y) \ - { \ - int16x8_t x0 = x; \ - int16x8_t y0 = y; \ - x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); \ - y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); \ - } - - // pass 1 - dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 - dct_trn16(row2, row3); - dct_trn16(row4, row5); - dct_trn16(row6, row7); - - // pass 2 - dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 - dct_trn32(row1, row3); - dct_trn32(row4, row6); - dct_trn32(row5, row7); - - // pass 3 - dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 - dct_trn64(row1, row5); - dct_trn64(row2, row6); - dct_trn64(row3, row7); - -#undef dct_trn16 -#undef dct_trn32 -#undef dct_trn64 - } - - // row pass - // vrshrn_n_s32 only supports shifts up to 16, we need - // 17. so do a non-rounding shift of 16 first then follow - // up with a rounding shift by 1. - dct_pass(vshrn_n_s32, 16); - - { - // pack and round - uint8x8_t p0 = vqrshrun_n_s16(row0, 1); - uint8x8_t p1 = vqrshrun_n_s16(row1, 1); - uint8x8_t p2 = vqrshrun_n_s16(row2, 1); - uint8x8_t p3 = vqrshrun_n_s16(row3, 1); - uint8x8_t p4 = vqrshrun_n_s16(row4, 1); - uint8x8_t p5 = vqrshrun_n_s16(row5, 1); - uint8x8_t p6 = vqrshrun_n_s16(row6, 1); - uint8x8_t p7 = vqrshrun_n_s16(row7, 1); - - // again, these can translate into one instruction, but often don't. -#define dct_trn8_8(x, y) \ - { \ - uint8x8x2_t t = vtrn_u8(x, y); \ - x = t.val[0]; \ - y = t.val[1]; \ - } -#define dct_trn8_16(x, y) \ - { \ - uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); \ - x = vreinterpret_u8_u16(t.val[0]); \ - y = vreinterpret_u8_u16(t.val[1]); \ - } -#define dct_trn8_32(x, y) \ - { \ - uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); \ - x = vreinterpret_u8_u32(t.val[0]); \ - y = vreinterpret_u8_u32(t.val[1]); \ - } - - // sadly can't use interleaved stores here since we only write - // 8 bytes to each scan line! - - // 8x8 8-bit transpose pass 1 - dct_trn8_8(p0, p1); - dct_trn8_8(p2, p3); - dct_trn8_8(p4, p5); - dct_trn8_8(p6, p7); - - // pass 2 - dct_trn8_16(p0, p2); - dct_trn8_16(p1, p3); - dct_trn8_16(p4, p6); - dct_trn8_16(p5, p7); - - // pass 3 - dct_trn8_32(p0, p4); - dct_trn8_32(p1, p5); - dct_trn8_32(p2, p6); - dct_trn8_32(p3, p7); - - // store - vst1_u8(out, p0); - out += out_stride; - vst1_u8(out, p1); - out += out_stride; - vst1_u8(out, p2); - out += out_stride; - vst1_u8(out, p3); - out += out_stride; - vst1_u8(out, p4); - out += out_stride; - vst1_u8(out, p5); - out += out_stride; - vst1_u8(out, p6); - out += out_stride; - vst1_u8(out, p7); - -#undef dct_trn8_8 -#undef dct_trn8_16 -#undef dct_trn8_32 - } - -#undef dct_long_mul -#undef dct_long_mac -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_pass -} - -#endif // STBI_NEON - -#define STBI__MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static stbi_uc stbi__get_marker(stbi__jpeg * j) { - stbi_uc x; - if (j->marker != STBI__MARKER_none) { - x = j->marker; - j->marker = STBI__MARKER_none; - return x; - } - x = stbi__get8(j->s); - if (x != 0xff) - return STBI__MARKER_none; - while (x == 0xff) - x = stbi__get8(j->s); // consume repeated 0xff fill bytes - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, stbi__jpeg_reset the entropy decoder and -// the dc prediction -static void stbi__jpeg_reset(stbi__jpeg * j) { - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; - j->marker = STBI__MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - j->eob_run = 0; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int stbi__parse_entropy_coded_data(stbi__jpeg * z) { - stbi__jpeg_reset(z); - if (!z->progressive) { - if (z->scan_n == 1) { - int i, j; - STBI_SIMD_ALIGN(short, data[64]); - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x + 7) >> 3; - int h = (z->img_comp[n].y + 7) >> 3; - for (j = 0; j < h; ++j) { - for (i = 0; i < w; ++i) { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, - z->dequant[z->img_comp[n].tq])) - return 0; - z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data); - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) - stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) - return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i, j, k, x, y; - STBI_SIMD_ALIGN(short, data[64]); - for (j = 0; j < z->img_mcu_y; ++j) { - for (i = 0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k = 0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y = 0; y < z->img_comp[n].v; ++y) { - for (x = 0; x < z->img_comp[n].h; ++x) { - int x2 = (i * z->img_comp[n].h + x) * 8; - int y2 = (j * z->img_comp[n].v + y) * 8; - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, - z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) - return 0; - z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2, z->img_comp[n].w2, - data); - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) - stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) - return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } else { - if (z->scan_n == 1) { - int i, j; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x + 7) >> 3; - int h = (z->img_comp[n].y + 7) >> 3; - for (j = 0; j < h; ++j) { - for (i = 0; i < w; ++i) { - short * data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - if (z->spec_start == 0) { - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } else { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) - return 0; - } - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) - stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) - return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i, j, k, x, y; - for (j = 0; j < z->img_mcu_y; ++j) { - for (i = 0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k = 0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y = 0; y < z->img_comp[n].v; ++y) { - for (x = 0; x < z->img_comp[n].h; ++x) { - int x2 = (i * z->img_comp[n].h + x); - int y2 = (j * z->img_comp[n].v + y); - short * data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) - stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) - return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } -} - -static void stbi__jpeg_dequantize(short * data, stbi__uint16 * dequant) { - int i; - for (i = 0; i < 64; ++i) - data[i] *= dequant[i]; -} - -static void stbi__jpeg_finish(stbi__jpeg * z) { - if (z->progressive) { - // dequantize and idct the data - int i, j, n; - for (n = 0; n < z->s->img_n; ++n) { - int w = (z->img_comp[n].x + 7) >> 3; - int h = (z->img_comp[n].y + 7) >> 3; - for (j = 0; j < h; ++j) { - for (i = 0; i < w; ++i) { - short * data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); - z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data); - } - } - } - } -} - -static int stbi__process_marker(stbi__jpeg * z, int m) { - int L; - switch (m) { - case STBI__MARKER_none: // no marker found - return stbi__err("expected marker", "Corrupt JPEG"); - - case 0xDD: // DRI - specify restart interval - if (stbi__get16be(z->s) != 4) - return stbi__err("bad DRI len", "Corrupt JPEG"); - z->restart_interval = stbi__get16be(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = stbi__get16be(z->s) - 2; - while (L > 0) { - int q = stbi__get8(z->s); - int p = q >> 4, sixteen = (p != 0); - int t = q & 15, i; - if (p != 0 && p != 1) - return stbi__err("bad DQT type", "Corrupt JPEG"); - if (t > 3) - return stbi__err("bad DQT table", "Corrupt JPEG"); - - for (i = 0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); - L -= (sixteen ? 129 : 65); - } - return L == 0; - - case 0xC4: // DHT - define huffman table - L = stbi__get16be(z->s) - 2; - while (L > 0) { - stbi_uc * v; - int sizes[16], i, n = 0; - int q = stbi__get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) - return stbi__err("bad DHT header", "Corrupt JPEG"); - for (i = 0; i < 16; ++i) { - sizes[i] = stbi__get8(z->s); - n += sizes[i]; - } - if (n > 256) - return stbi__err("bad DHT header", "Corrupt JPEG"); // Loop over i < n would write past end of values! - L -= 17; - if (tc == 0) { - if (!stbi__build_huffman(z->huff_dc + th, sizes)) - return 0; - v = z->huff_dc[th].values; - } else { - if (!stbi__build_huffman(z->huff_ac + th, sizes)) - return 0; - v = z->huff_ac[th].values; - } - for (i = 0; i < n; ++i) - v[i] = stbi__get8(z->s); - if (tc != 0) - stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); - L -= n; - } - return L == 0; - } - - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - L = stbi__get16be(z->s); - if (L < 2) { - if (m == 0xFE) - return stbi__err("bad COM len", "Corrupt JPEG"); - else - return stbi__err("bad APP len", "Corrupt JPEG"); - } - L -= 2; - - if (m == 0xE0 && L >= 5) { // JFIF APP0 segment - static const unsigned char tag[5] = {'J', 'F', 'I', 'F', '\0'}; - int ok = 1; - int i; - for (i = 0; i < 5; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 5; - if (ok) - z->jfif = 1; - } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment - static const unsigned char tag[6] = {'A', 'd', 'o', 'b', 'e', '\0'}; - int ok = 1; - int i; - for (i = 0; i < 6; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 6; - if (ok) { - stbi__get8(z->s); // version - stbi__get16be(z->s); // flags0 - stbi__get16be(z->s); // flags1 - z->app14_color_transform = stbi__get8(z->s); // color transform - L -= 6; - } - } - - stbi__skip(z->s, L); - return 1; - } - - return stbi__err("unknown marker", "Corrupt JPEG"); -} - -// after we see SOS -static int stbi__process_scan_header(stbi__jpeg * z) { - int i; - int Ls = stbi__get16be(z->s); - z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int)z->s->img_n) - return stbi__err("bad SOS component count", "Corrupt JPEG"); - if (Ls != 6 + 2 * z->scan_n) - return stbi__err("bad SOS len", "Corrupt JPEG"); - for (i = 0; i < z->scan_n; ++i) { - int id = stbi__get8(z->s), which; - int q = stbi__get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) - return 0; // no match - z->img_comp[which].hd = q >> 4; - if (z->img_comp[which].hd > 3) - return stbi__err("bad DC huff", "Corrupt JPEG"); - z->img_comp[which].ha = q & 15; - if (z->img_comp[which].ha > 3) - return stbi__err("bad AC huff", "Corrupt JPEG"); - z->order[i] = which; - } - - { - int aa; - z->spec_start = stbi__get8(z->s); - z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 - aa = stbi__get8(z->s); - z->succ_high = (aa >> 4); - z->succ_low = (aa & 15); - if (z->progressive) { - if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) - return stbi__err("bad SOS", "Corrupt JPEG"); - } else { - if (z->spec_start != 0) - return stbi__err("bad SOS", "Corrupt JPEG"); - if (z->succ_high != 0 || z->succ_low != 0) - return stbi__err("bad SOS", "Corrupt JPEG"); - z->spec_end = 63; - } - } - - return 1; -} - -static int stbi__free_jpeg_components(stbi__jpeg * z, int ncomp, int why) { - int i; - for (i = 0; i < ncomp; ++i) { - if (z->img_comp[i].raw_data) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - z->img_comp[i].data = NULL; - } - if (z->img_comp[i].raw_coeff) { - STBI_FREE(z->img_comp[i].raw_coeff); - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].coeff = 0; - } - if (z->img_comp[i].linebuf) { - STBI_FREE(z->img_comp[i].linebuf); - z->img_comp[i].linebuf = NULL; - } - } - return why; -} - -static int stbi__process_frame_header(stbi__jpeg * z, int scan) { - stbi__context * s = z->s; - int Lf, p, i, q, h_max = 1, v_max = 1, c; - Lf = stbi__get16be(s); - if (Lf < 11) - return stbi__err("bad SOF len", "Corrupt JPEG"); // JPEG - p = stbi__get8(s); - if (p != 8) - return stbi__err("only 8-bit", "JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); - if (s->img_y == 0) - return stbi__err("no header height", - "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); - if (s->img_x == 0) - return stbi__err("0 width", "Corrupt JPEG"); // JPEG requires - if (s->img_y > STBI_MAX_DIMENSIONS) - return stbi__err("too large", "Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) - return stbi__err("too large", "Very large image (corrupt?)"); - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) - return stbi__err("bad component count", "Corrupt JPEG"); - s->img_n = c; - for (i = 0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8 + 3 * s->img_n) - return stbi__err("bad SOF len", "Corrupt JPEG"); - - z->rgb = 0; - for (i = 0; i < s->img_n; ++i) { - static const unsigned char rgb[3] = {'R', 'G', 'B'}; - z->img_comp[i].id = stbi__get8(s); - if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) - ++z->rgb; - q = stbi__get8(s); - z->img_comp[i].h = (q >> 4); - if (!z->img_comp[i].h || z->img_comp[i].h > 4) - return stbi__err("bad H", "Corrupt JPEG"); - z->img_comp[i].v = q & 15; - if (!z->img_comp[i].v || z->img_comp[i].v > 4) - return stbi__err("bad V", "Corrupt JPEG"); - z->img_comp[i].tq = stbi__get8(s); - if (z->img_comp[i].tq > 3) - return stbi__err("bad TQ", "Corrupt JPEG"); - } - - if (scan != STBI__SCAN_load) - return 1; - - if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) - return stbi__err("too large", "Image too large to decode"); - - for (i = 0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) - h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) - v_max = z->img_comp[i].v; - } - - // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios - // and I've never seen a non-corrupted JPEG file actually use them - for (i = 0; i < s->img_n; ++i) { - if (h_max % z->img_comp[i].h != 0) - return stbi__err("bad H", "Corrupt JPEG"); - if (v_max % z->img_comp[i].v != 0) - return stbi__err("bad V", "Corrupt JPEG"); - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - // these sizes can't be more than 17 bits - z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h; - - for (i = 0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - // - // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) - // so these muls can't overflow with 32-bit ints (which we require) - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].linebuf = NULL; - z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); - if (z->img_comp[i].raw_data == NULL) - return stbi__free_jpeg_components(z, i + 1, stbi__err("outofmem", "Out of memory")); - // align blocks for idct using mmx/sse - z->img_comp[i].data = (stbi_uc *)(((size_t)z->img_comp[i].raw_data + 15) & ~15); - if (z->progressive) { - // w2, h2 are multiples of 8 (see above) - z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; - z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; - z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); - if (z->img_comp[i].raw_coeff == NULL) - return stbi__free_jpeg_components(z, i + 1, stbi__err("outofmem", "Out of memory")); - z->img_comp[i].coeff = (short *)(((size_t)z->img_comp[i].raw_coeff + 15) & ~15); - } - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define stbi__DNL(x) ((x) == 0xdc) -#define stbi__SOI(x) ((x) == 0xd8) -#define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) -#define stbi__SOS(x) ((x) == 0xda) - -#define stbi__SOF_progressive(x) ((x) == 0xc2) - -static int stbi__decode_jpeg_header(stbi__jpeg * z, int scan) { - int m; - z->jfif = 0; - z->app14_color_transform = -1; // valid values are 0,1,2 - z->marker = STBI__MARKER_none; // initialize cached marker to empty - m = stbi__get_marker(z); - if (!stbi__SOI(m)) - return stbi__err("no SOI", "Corrupt JPEG"); - if (scan == STBI__SCAN_type) - return 1; - m = stbi__get_marker(z); - while (!stbi__SOF(m)) { - if (!stbi__process_marker(z, m)) - return 0; - m = stbi__get_marker(z); - while (m == STBI__MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) - return stbi__err("no SOF", "Corrupt JPEG"); - m = stbi__get_marker(z); - } - } - z->progressive = stbi__SOF_progressive(m); - if (!stbi__process_frame_header(z, scan)) - return 0; - return 1; -} - -static int stbi__skip_jpeg_junk_at_end(stbi__jpeg * j) { - // some JPEGs have junk at end, skip over it but if we find what looks - // like a valid marker, resume there - while (!stbi__at_eof(j->s)) { - int x = stbi__get8(j->s); - while (x == 255) { // might be a marker - if (stbi__at_eof(j->s)) - return STBI__MARKER_none; - x = stbi__get8(j->s); - if (x != 0x00 && x != 0xff) { - // not a stuffed zero or lead-in to another marker, looks - // like an actual marker, return it - return x; - } - // stuffed zero has x=0 now which ends the loop, meaning we go - // back to regular scan loop. - // repeated 0xff keeps trying to read the next byte of the marker. - } - } - return STBI__MARKER_none; -} - -// decode image to YCbCr format -static int stbi__decode_jpeg_image(stbi__jpeg * j) { - int m; - for (m = 0; m < 4; m++) { - j->img_comp[m].raw_data = NULL; - j->img_comp[m].raw_coeff = NULL; - } - j->restart_interval = 0; - if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) - return 0; - m = stbi__get_marker(j); - while (!stbi__EOI(m)) { - if (stbi__SOS(m)) { - if (!stbi__process_scan_header(j)) - return 0; - if (!stbi__parse_entropy_coded_data(j)) - return 0; - if (j->marker == STBI__MARKER_none) { - j->marker = stbi__skip_jpeg_junk_at_end(j); - // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 - } - m = stbi__get_marker(j); - if (STBI__RESTART(m)) - m = stbi__get_marker(j); - } else if (stbi__DNL(m)) { - int Ld = stbi__get16be(j->s); - stbi__uint32 NL = stbi__get16be(j->s); - if (Ld != 4) - return stbi__err("bad DNL len", "Corrupt JPEG"); - if (NL != j->s->img_y) - return stbi__err("bad DNL height", "Corrupt JPEG"); - m = stbi__get_marker(j); - } else { - if (!stbi__process_marker(j, m)) - return 1; - m = stbi__get_marker(j); - } - } - if (j->progressive) - stbi__jpeg_finish(j); - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef stbi_uc * (*resample_row_func)(stbi_uc * out, stbi_uc * in0, stbi_uc * in1, int w, int hs); - -#define stbi__div4(x) ((stbi_uc)((x) >> 2)) - -static stbi_uc * resample_row_1(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static stbi_uc * stbi__resample_row_v_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i = 0; i < w; ++i) - out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2); - return out; -} - -static stbi_uc * stbi__resample_row_h_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { - // need to generate two samples horizontally for every one in input - int i; - stbi_uc * input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = stbi__div4(input[0] * 3 + input[1] + 2); - for (i = 1; i < w - 1; ++i) { - int n = 3 * input[i] + 2; - out[i * 2 + 0] = stbi__div4(n + input[i - 1]); - out[i * 2 + 1] = stbi__div4(n + input[i + 1]); - } - out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2); - out[i * 2 + 1] = input[w - 1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define stbi__div16(x) ((stbi_uc)((x) >> 4)) - -static stbi_uc * stbi__resample_row_hv_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { - // need to generate 2x2 samples for every one in input - int i, t0, t1; - if (w == 1) { - out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3 * in_near[0] + in_far[0]; - out[0] = stbi__div4(t1 + 2); - for (i = 1; i < w; ++i) { - t0 = t1; - t1 = 3 * in_near[i] + in_far[i]; - out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8); - out[i * 2] = stbi__div16(3 * t1 + t0 + 8); - } - out[w * 2 - 1] = stbi__div4(t1 + 2); - - STBI_NOTUSED(hs); - - return out; -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static stbi_uc * stbi__resample_row_hv_2_simd(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { - // need to generate 2x2 samples for every one in input - int i = 0, t0, t1; - - if (w == 1) { - out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3 * in_near[0] + in_far[0]; - // process groups of 8 pixels for as long as we can. - // note we can't handle the last pixel in a row in this loop - // because we need to handle the filter boundary conditions. - for (; i < ((w - 1) & ~7); i += 8) { -#if defined(STBI_SSE2) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - __m128i zero = _mm_setzero_si128(); - __m128i farb = _mm_loadl_epi64((__m128i *)(in_far + i)); - __m128i nearb = _mm_loadl_epi64((__m128i *)(in_near + i)); - __m128i farw = _mm_unpacklo_epi8(farb, zero); - __m128i nearw = _mm_unpacklo_epi8(nearb, zero); - __m128i diff = _mm_sub_epi16(farw, nearw); - __m128i nears = _mm_slli_epi16(nearw, 2); - __m128i curr = _mm_add_epi16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - __m128i prv0 = _mm_slli_si128(curr, 2); - __m128i nxt0 = _mm_srli_si128(curr, 2); - __m128i prev = _mm_insert_epi16(prv0, t1, 0); - __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - __m128i bias = _mm_set1_epi16(8); - __m128i curs = _mm_slli_epi16(curr, 2); - __m128i prvd = _mm_sub_epi16(prev, curr); - __m128i nxtd = _mm_sub_epi16(next, curr); - __m128i curb = _mm_add_epi16(curs, bias); - __m128i even = _mm_add_epi16(prvd, curb); - __m128i odd = _mm_add_epi16(nxtd, curb); - - // interleave even and odd pixels, then undo scaling. - __m128i int0 = _mm_unpacklo_epi16(even, odd); - __m128i int1 = _mm_unpackhi_epi16(even, odd); - __m128i de0 = _mm_srli_epi16(int0, 4); - __m128i de1 = _mm_srli_epi16(int1, 4); - - // pack and write output - __m128i outv = _mm_packus_epi16(de0, de1); - _mm_storeu_si128((__m128i *)(out + i * 2), outv); -#elif defined(STBI_NEON) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - uint8x8_t farb = vld1_u8(in_far + i); - uint8x8_t nearb = vld1_u8(in_near + i); - int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); - int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); - int16x8_t curr = vaddq_s16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - int16x8_t prv0 = vextq_s16(curr, curr, 7); - int16x8_t nxt0 = vextq_s16(curr, curr, 1); - int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); - int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - int16x8_t curs = vshlq_n_s16(curr, 2); - int16x8_t prvd = vsubq_s16(prev, curr); - int16x8_t nxtd = vsubq_s16(next, curr); - int16x8_t even = vaddq_s16(curs, prvd); - int16x8_t odd = vaddq_s16(curs, nxtd); - - // undo scaling and round, then store with even/odd phases interleaved - uint8x8x2_t o; - o.val[0] = vqrshrun_n_s16(even, 4); - o.val[1] = vqrshrun_n_s16(odd, 4); - vst2_u8(out + i * 2, o); -#endif - - // "previous" value for next iter - t1 = 3 * in_near[i + 7] + in_far[i + 7]; - } - - t0 = t1; - t1 = 3 * in_near[i] + in_far[i]; - out[i * 2] = stbi__div16(3 * t1 + t0 + 8); - - for (++i; i < w; ++i) { - t0 = t1; - t1 = 3 * in_near[i] + in_far[i]; - out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8); - out[i * 2] = stbi__div16(3 * t1 + t0 + 8); - } - out[w * 2 - 1] = stbi__div4(t1 + 2); - - STBI_NOTUSED(hs); - - return out; -} -#endif - -static stbi_uc * stbi__resample_row_generic(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { - // resample with nearest-neighbor - int i, j; - STBI_NOTUSED(in_far); - for (i = 0; i < w; ++i) - for (j = 0; j < hs; ++j) - out[i * hs + j] = in_near[i]; - return out; -} - -// this is a reduced-precision calculation of YCbCr-to-RGB introduced -// to make sure the code produces the same results in both SIMD and scalar -#define stbi__float2fixed(x) (((int)((x)*4096.0f + 0.5f)) << 8) -static void stbi__YCbCr_to_RGB_row(stbi_uc * out, const stbi_uc * y, const stbi_uc * pcb, const stbi_uc * pcr, int count, - int step) { - int i; - for (i = 0; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1 << 19); // rounding - int r, g, b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr * stbi__float2fixed(1.40200f); - g = y_fixed + (cr * -stbi__float2fixed(0.71414f)) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb * stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned)r > 255) { - if (r < 0) - r = 0; - else - r = 255; - } - if ((unsigned)g > 255) { - if (g < 0) - g = 0; - else - g = 255; - } - if ((unsigned)b > 255) { - if (b < 0) - b = 0; - else - b = 255; - } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static void stbi__YCbCr_to_RGB_simd(stbi_uc * out, stbi_uc const * y, stbi_uc const * pcb, stbi_uc const * pcr, int count, - int step) { - int i = 0; - -#ifdef STBI_SSE2 - // step == 3 is pretty ugly on the final interleave, and i'm not convinced - // it's useful in practice (you wouldn't use it for textures, for example). - // so just accelerate step == 4 case. - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - __m128i signflip = _mm_set1_epi8(-0x80); - __m128i cr_const0 = _mm_set1_epi16((short)(1.40200f * 4096.0f + 0.5f)); - __m128i cr_const1 = _mm_set1_epi16(-(short)(0.71414f * 4096.0f + 0.5f)); - __m128i cb_const0 = _mm_set1_epi16(-(short)(0.34414f * 4096.0f + 0.5f)); - __m128i cb_const1 = _mm_set1_epi16((short)(1.77200f * 4096.0f + 0.5f)); - __m128i y_bias = _mm_set1_epi8((char)(unsigned char)128); - __m128i xw = _mm_set1_epi16(255); // alpha channel - - for (; i + 7 < count; i += 8) { - // load - __m128i y_bytes = _mm_loadl_epi64((__m128i *)(y + i)); - __m128i cr_bytes = _mm_loadl_epi64((__m128i *)(pcr + i)); - __m128i cb_bytes = _mm_loadl_epi64((__m128i *)(pcb + i)); - __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 - __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 - - // unpack to short (and left-shift cr, cb by 8) - __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); - __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); - __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); - - // color transform - __m128i yws = _mm_srli_epi16(yw, 4); - __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); - __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); - __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); - __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); - __m128i rws = _mm_add_epi16(cr0, yws); - __m128i gwt = _mm_add_epi16(cb0, yws); - __m128i bws = _mm_add_epi16(yws, cb1); - __m128i gws = _mm_add_epi16(gwt, cr1); - - // descale - __m128i rw = _mm_srai_epi16(rws, 4); - __m128i bw = _mm_srai_epi16(bws, 4); - __m128i gw = _mm_srai_epi16(gws, 4); - - // back to byte, set up for transpose - __m128i brb = _mm_packus_epi16(rw, bw); - __m128i gxb = _mm_packus_epi16(gw, xw); - - // transpose to interleave channels - __m128i t0 = _mm_unpacklo_epi8(brb, gxb); - __m128i t1 = _mm_unpackhi_epi8(brb, gxb); - __m128i o0 = _mm_unpacklo_epi16(t0, t1); - __m128i o1 = _mm_unpackhi_epi16(t0, t1); - - // store - _mm_storeu_si128((__m128i *)(out + 0), o0); - _mm_storeu_si128((__m128i *)(out + 16), o1); - out += 32; - } - } -#endif - -#ifdef STBI_NEON - // in this version, step=3 support would be easy to add. but is there demand? - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - uint8x8_t signflip = vdup_n_u8(0x80); - int16x8_t cr_const0 = vdupq_n_s16((short)(1.40200f * 4096.0f + 0.5f)); - int16x8_t cr_const1 = vdupq_n_s16(-(short)(0.71414f * 4096.0f + 0.5f)); - int16x8_t cb_const0 = vdupq_n_s16(-(short)(0.34414f * 4096.0f + 0.5f)); - int16x8_t cb_const1 = vdupq_n_s16((short)(1.77200f * 4096.0f + 0.5f)); - - for (; i + 7 < count; i += 8) { - // load - uint8x8_t y_bytes = vld1_u8(y + i); - uint8x8_t cr_bytes = vld1_u8(pcr + i); - uint8x8_t cb_bytes = vld1_u8(pcb + i); - int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); - int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); - - // expand to s16 - int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); - int16x8_t crw = vshll_n_s8(cr_biased, 7); - int16x8_t cbw = vshll_n_s8(cb_biased, 7); - - // color transform - int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); - int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); - int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); - int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); - int16x8_t rws = vaddq_s16(yws, cr0); - int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); - int16x8_t bws = vaddq_s16(yws, cb1); - - // undo scaling, round, convert to byte - uint8x8x4_t o; - o.val[0] = vqrshrun_n_s16(rws, 4); - o.val[1] = vqrshrun_n_s16(gws, 4); - o.val[2] = vqrshrun_n_s16(bws, 4); - o.val[3] = vdup_n_u8(255); - - // store, interleaving r/g/b/a - vst4_u8(out, o); - out += 8 * 4; - } - } -#endif - - for (; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1 << 19); // rounding - int r, g, b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr * stbi__float2fixed(1.40200f); - g = y_fixed + cr * -stbi__float2fixed(0.71414f) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb * stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned)r > 255) { - if (r < 0) - r = 0; - else - r = 255; - } - if ((unsigned)g > 255) { - if (g < 0) - g = 0; - else - g = 255; - } - if ((unsigned)b > 255) { - if (b < 0) - b = 0; - else - b = 255; - } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#endif - -// set up the kernels -static void stbi__setup_jpeg(stbi__jpeg * j) { - j->idct_block_kernel = stbi__idct_block; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; - -#ifdef STBI_SSE2 - if (stbi__sse2_available()) { - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; - } -#endif - -#ifdef STBI_NEON - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; -#endif -} - -// clean up the temporary component buffers -static void stbi__cleanup_jpeg(stbi__jpeg * j) { stbi__free_jpeg_components(j, j->s->img_n, 0); } - -typedef struct { - resample_row_func resample; - stbi_uc *line0, *line1; - int hs, vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi__resample; - -// fast 0..255 * 0..255 => 0..255 rounded multiplication -static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) { - unsigned int t = x * y + 128; - return (stbi_uc)((t + (t >> 8)) >> 8); -} - -static stbi_uc * load_jpeg_image(stbi__jpeg * z, int * out_x, int * out_y, int * comp, int req_comp) { - int n, decode_n, is_rgb; - z->s->img_n = 0; // make stbi__cleanup_jpeg safe - - // validate req_comp - if (req_comp < 0 || req_comp > 4) - return stbi__errpuc("bad req_comp", "Internal error"); - - // load a jpeg image from whichever source, but leave in YCbCr format - if (!stbi__decode_jpeg_image(z)) { - stbi__cleanup_jpeg(z); - return NULL; - } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - - is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - - if (z->s->img_n == 3 && n < 3 && !is_rgb) - decode_n = 1; - else - decode_n = z->s->img_n; - - // nothing to do if no components requested; check this now to avoid - // accessing uninitialized coutput[0] later - if (decode_n <= 0) { - stbi__cleanup_jpeg(z); - return NULL; - } - - // resample and color-convert - { - int k; - unsigned int i, j; - stbi_uc * output; - stbi_uc * coutput[4] = {NULL, NULL, NULL, NULL}; - - stbi__resample res_comp[4]; - - for (k = 0; k < decode_n; ++k) { - stbi__resample * r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *)stbi__malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { - stbi__cleanup_jpeg(z); - return stbi__errpuc("outofmem", "Out of memory"); - } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs - 1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) - r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) - r->resample = stbi__resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) - r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) - r->resample = z->resample_row_hv_2_kernel; - else - r->resample = stbi__resample_row_generic; - } - - // can't error after this so, this is safe - output = (stbi_uc *)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); - if (!output) { - stbi__cleanup_jpeg(z); - return stbi__errpuc("outofmem", "Out of memory"); - } - - // now go ahead and resample - for (j = 0; j < z->s->img_y; ++j) { - stbi_uc * out = output + n * z->s->img_x * j; - for (k = 0; k < decode_n; ++k) { - stbi__resample * r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, y_bot ? r->line1 : r->line0, y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - stbi_uc * y = coutput[0]; - if (z->s->img_n == 3) { - if (is_rgb) { - for (i = 0; i < z->s->img_x; ++i) { - out[0] = y[i]; - out[1] = coutput[1][i]; - out[2] = coutput[2][i]; - out[3] = 255; - out += n; - } - } else { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else if (z->s->img_n == 4) { - if (z->app14_color_transform == 0) { // CMYK - for (i = 0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(coutput[0][i], m); - out[1] = stbi__blinn_8x8(coutput[1][i], m); - out[2] = stbi__blinn_8x8(coutput[2][i], m); - out[3] = 255; - out += n; - } - } else if (z->app14_color_transform == 2) { // YCCK - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - for (i = 0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(255 - out[0], m); - out[1] = stbi__blinn_8x8(255 - out[1], m); - out[2] = stbi__blinn_8x8(255 - out[2], m); - out += n; - } - } else { // YCbCr + alpha? Ignore the fourth channel for now - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else - for (i = 0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - if (is_rgb) { - if (n == 1) - for (i = 0; i < z->s->img_x; ++i) - *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - else { - for (i = 0; i < z->s->img_x; ++i, out += 2) { - out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - out[1] = 255; - } - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { - for (i = 0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); - stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); - stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); - out[0] = stbi__compute_y(r, g, b); - out[1] = 255; - out += n; - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { - for (i = 0; i < z->s->img_x; ++i) { - out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); - out[1] = 255; - out += n; - } - } else { - stbi_uc * y = coutput[0]; - if (n == 1) - for (i = 0; i < z->s->img_x; ++i) - out[i] = y[i]; - else - for (i = 0; i < z->s->img_x; ++i) { - *out++ = y[i]; - *out++ = 255; - } - } - } - } - stbi__cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) - *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output - return output; - } -} - -static void * stbi__jpeg_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { - unsigned char * result; - stbi__jpeg * j = (stbi__jpeg *)stbi__malloc(sizeof(stbi__jpeg)); - if (!j) - return stbi__errpuc("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); - result = load_jpeg_image(j, x, y, comp, req_comp); - STBI_FREE(j); - return result; -} - -static int stbi__jpeg_test(stbi__context * s) { - int r; - stbi__jpeg * j = (stbi__jpeg *)stbi__malloc(sizeof(stbi__jpeg)); - if (!j) - return stbi__err("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); - stbi__rewind(s); - STBI_FREE(j); - return r; -} - -static int stbi__jpeg_info_raw(stbi__jpeg * j, int * x, int * y, int * comp) { - if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { - stbi__rewind(j->s); - return 0; - } - if (x) - *x = j->s->img_x; - if (y) - *y = j->s->img_y; - if (comp) - *comp = j->s->img_n >= 3 ? 3 : 1; - return 1; -} - -static int stbi__jpeg_info(stbi__context * s, int * x, int * y, int * comp) { - int result; - stbi__jpeg * j = (stbi__jpeg *)(stbi__malloc(sizeof(stbi__jpeg))); - if (!j) - return stbi__err("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); - return result; -} -#endif - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -#ifndef STBI_NO_ZLIB - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables -#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) -#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct { - stbi__uint16 fast[1 << STBI__ZFAST_BITS]; - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; - stbi_uc size[STBI__ZNSYMS]; - stbi__uint16 value[STBI__ZNSYMS]; -} stbi__zhuffman; - -stbi_inline static int stbi__bitreverse16(int n) { - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int stbi__bit_reverse(int v, int bits) { - STBI_ASSERT(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return stbi__bitreverse16(v) >> (16 - bits); -} - -static int stbi__zbuild_huffman(stbi__zhuffman * z, const stbi_uc * sizelist, int num) { - int i, k = 0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 0, sizeof(z->fast)); - for (i = 0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i = 1; i < 16; ++i) - if (sizes[i] > (1 << i)) - return stbi__err("bad sizes", "Corrupt PNG"); - code = 0; - for (i = 1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (stbi__uint16)code; - z->firstsymbol[i] = (stbi__uint16)k; - code = (code + sizes[i]); - if (sizes[i]) - if (code - 1 >= (1 << i)) - return stbi__err("bad codelengths", "Corrupt PNG"); - z->maxcode[i] = code << (16 - i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i = 0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - stbi__uint16 fastv = (stbi__uint16)((s << 9) | i); - z->size[c] = (stbi_uc)s; - z->value[c] = (stbi__uint16)i; - if (s <= STBI__ZFAST_BITS) { - int j = stbi__bit_reverse(next_code[s], s); - while (j < (1 << STBI__ZFAST_BITS)) { - z->fast[j] = fastv; - j += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct { - stbi_uc *zbuffer, *zbuffer_end; - int num_bits; - stbi__uint32 code_buffer; - - char * zout; - char * zout_start; - char * zout_end; - int z_expandable; - - stbi__zhuffman z_length, z_distance; -} stbi__zbuf; - -stbi_inline static int stbi__zeof(stbi__zbuf * z) { return (z->zbuffer >= z->zbuffer_end); } - -stbi_inline static stbi_uc stbi__zget8(stbi__zbuf * z) { return stbi__zeof(z) ? 0 : *z->zbuffer++; } - -static void stbi__fill_bits(stbi__zbuf * z) { - do { - if (z->code_buffer >= (1U << z->num_bits)) { - z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ - return; - } - z->code_buffer |= (unsigned int)stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int stbi__zreceive(stbi__zbuf * z, int n) { - unsigned int k; - if (z->num_bits < n) - stbi__fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -static int stbi__zhuffman_decode_slowpath(stbi__zbuf * a, stbi__zhuffman * z) { - int b, s, k; - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = stbi__bit_reverse(a->code_buffer, 16); - for (s = STBI__ZFAST_BITS + 1;; ++s) - if (k < z->maxcode[s]) - break; - if (s >= 16) - return -1; // invalid code! - // code size is s, so: - b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s]; - if (b >= STBI__ZNSYMS) - return -1; // some data was corrupt somewhere! - if (z->size[b] != s) - return -1; // was originally an assert, but report failure instead. - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf * a, stbi__zhuffman * z) { - int b, s; - if (a->num_bits < 16) { - if (stbi__zeof(a)) { - return -1; /* report error for unexpected end of data. */ - } - stbi__fill_bits(a); - } - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; - a->code_buffer >>= s; - a->num_bits -= s; - return b & 511; - } - return stbi__zhuffman_decode_slowpath(a, z); -} - -static int stbi__zexpand(stbi__zbuf * z, char * zout, int n) // need to make room for n bytes -{ - char * q; - unsigned int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) - return stbi__err("output buffer limit", "Corrupt PNG"); - cur = (unsigned int)(z->zout - z->zout_start); - limit = old_limit = (unsigned)(z->zout_end - z->zout_start); - if (UINT_MAX - cur < (unsigned)n) - return stbi__err("outofmem", "Out of memory"); - while (cur + n > limit) { - if (limit > UINT_MAX / 2) - return stbi__err("outofmem", "Out of memory"); - limit *= 2; - } - q = (char *)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) - return stbi__err("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static const int stbi__zlength_base[31] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - -static const int stbi__zlength_extra[31] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0}; - -static const int stbi__zdist_base[32] = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, - 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, - 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; - -static const int stbi__zdist_extra[32] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, - 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - -static int stbi__parse_huffman_block(stbi__zbuf * a) { - char * zout = a->zout; - for (;;) { - int z = stbi__zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) - return stbi__err("bad huffman code", "Corrupt PNG"); // error in huffman codes - if (zout >= a->zout_end) { - if (!stbi__zexpand(a, zout, 1)) - return 0; - zout = a->zout; - } - *zout++ = (char)z; - } else { - stbi_uc * p; - int len, dist; - if (z == 256) { - a->zout = zout; - return 1; - } - if (z >= 286) - return stbi__err("bad huffman code", - "Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data - z -= 257; - len = stbi__zlength_base[z]; - if (stbi__zlength_extra[z]) - len += stbi__zreceive(a, stbi__zlength_extra[z]); - z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0 || z >= 30) - return stbi__err("bad huffman code", - "Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data - dist = stbi__zdist_base[z]; - if (stbi__zdist_extra[z]) - dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (zout - a->zout_start < dist) - return stbi__err("bad dist", "Corrupt PNG"); - if (zout + len > a->zout_end) { - if (!stbi__zexpand(a, zout, len)) - return 0; - zout = a->zout; - } - p = (stbi_uc *)(zout - dist); - if (dist == 1) { // run of one byte; common in images. - stbi_uc v = *p; - if (len) { - do - *zout++ = v; - while (--len); - } - } else { - if (len) { - do - *zout++ = *p++; - while (--len); - } - } - } - } -} - -static int stbi__compute_huffman_codes(stbi__zbuf * a) { - static const stbi_uc length_dezigzag[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - stbi__zhuffman z_codelength; - stbi_uc lencodes[286 + 32 + 137]; // padding for maximum single op - stbi_uc codelength_sizes[19]; - int i, n; - - int hlit = stbi__zreceive(a, 5) + 257; - int hdist = stbi__zreceive(a, 5) + 1; - int hclen = stbi__zreceive(a, 4) + 4; - int ntot = hlit + hdist; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i = 0; i < hclen; ++i) { - int s = stbi__zreceive(a, 3); - codelength_sizes[length_dezigzag[i]] = (stbi_uc)s; - } - if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) - return 0; - - n = 0; - while (n < ntot) { - int c = stbi__zhuffman_decode(a, &z_codelength); - if (c < 0 || c >= 19) - return stbi__err("bad codelengths", "Corrupt PNG"); - if (c < 16) - lencodes[n++] = (stbi_uc)c; - else { - stbi_uc fill = 0; - if (c == 16) { - c = stbi__zreceive(a, 2) + 3; - if (n == 0) - return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n - 1]; - } else if (c == 17) { - c = stbi__zreceive(a, 3) + 3; - } else if (c == 18) { - c = stbi__zreceive(a, 7) + 11; - } else { - return stbi__err("bad codelengths", "Corrupt PNG"); - } - if (ntot - n < c) - return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes + n, fill, c); - n += c; - } - } - if (n != ntot) - return stbi__err("bad codelengths", "Corrupt PNG"); - if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) - return 0; - if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist)) - return 0; - return 1; -} - -static int stbi__parse_uncompressed_block(stbi__zbuf * a) { - stbi_uc header[4]; - int len, nlen, k; - if (a->num_bits & 7) - stbi__zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (stbi_uc)(a->code_buffer & 255); // suppress MSVC run-time check - a->code_buffer >>= 8; - a->num_bits -= 8; - } - if (a->num_bits < 0) - return stbi__err("zlib corrupt", "Corrupt PNG"); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) - return stbi__err("zlib corrupt", "Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) - return stbi__err("read past buffer", "Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, a->zout, len)) - return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int stbi__parse_zlib_header(stbi__zbuf * a) { - int cmf = stbi__zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); - if (stbi__zeof(a)) - return stbi__err("bad zlib header", "Corrupt PNG"); // zlib spec - if ((cmf * 256 + flg) % 31 != 0) - return stbi__err("bad zlib header", "Corrupt PNG"); // zlib spec - if (flg & 32) - return stbi__err("no preset dict", "Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) - return stbi__err("bad compression", "Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = { - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8}; -static const stbi_uc stbi__zdefault_distance[32] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; -/* -Init algorithm: -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; - for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; - for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; - for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; - - for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; -} -*/ - -static int stbi__parse_zlib(stbi__zbuf * a, int parse_header) { - int final, type; - if (parse_header) - if (!stbi__parse_zlib_header(a)) - return 0; - a->num_bits = 0; - a->code_buffer = 0; - do { - final = stbi__zreceive(a, 1); - type = stbi__zreceive(a, 2); - if (type == 0) { - if (!stbi__parse_uncompressed_block(a)) - return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, STBI__ZNSYMS)) - return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) - return 0; - } else { - if (!stbi__compute_huffman_codes(a)) - return 0; - } - if (!stbi__parse_huffman_block(a)) - return 0; - } - } while (!final); - return 1; -} - -static int stbi__do_zlib(stbi__zbuf * a, char * obuf, int olen, int exp, int parse_header) { - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return stbi__parse_zlib(a, parse_header); -} - -STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int * outlen) { - stbi__zbuf a; - char * p = (char *)stbi__malloc(initial_size); - if (p == NULL) - return NULL; - a.zbuffer = (stbi_uc *)buffer; - a.zbuffer_end = (stbi_uc *)buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) - *outlen = (int)(a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF char * stbi_zlib_decode_malloc(char const * buffer, int len, int * outlen) { - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char * buffer, int len, int initial_size, int * outlen, - int parse_header) { - stbi__zbuf a; - char * p = (char *)stbi__malloc(initial_size); - if (p == NULL) - return NULL; - a.zbuffer = (stbi_uc *)buffer; - a.zbuffer_end = (stbi_uc *)buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) - *outlen = (int)(a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_buffer(char * obuffer, int olen, char const * ibuffer, int ilen) { - stbi__zbuf a; - a.zbuffer = (stbi_uc *)ibuffer; - a.zbuffer_end = (stbi_uc *)ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) - return (int)(a.zout - a.zout_start); - else - return -1; -} - -STBIDEF char * stbi_zlib_decode_noheader_malloc(char const * buffer, int len, int * outlen) { - stbi__zbuf a; - char * p = (char *)stbi__malloc(16384); - if (p == NULL) - return NULL; - a.zbuffer = (stbi_uc *)buffer; - a.zbuffer_end = (stbi_uc *)buffer + len; - if (stbi__do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) - *outlen = (int)(a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_noheader_buffer(char * obuffer, int olen, const char * ibuffer, int ilen) { - stbi__zbuf a; - a.zbuffer = (stbi_uc *)ibuffer; - a.zbuffer_end = (stbi_uc *)ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) - return (int)(a.zout - a.zout_start); - else - return -1; -} -#endif - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - -#ifndef STBI_NO_PNG -typedef struct { - stbi__uint32 length; - stbi__uint32 type; -} stbi__pngchunk; - -static stbi__pngchunk stbi__get_chunk_header(stbi__context * s) { - stbi__pngchunk c; - c.length = stbi__get32be(s); - c.type = stbi__get32be(s); - return c; -} - -static int stbi__check_png_header(stbi__context * s) { - static const stbi_uc png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - int i; - for (i = 0; i < 8; ++i) - if (stbi__get8(s) != png_sig[i]) - return stbi__err("bad png sig", "Not a PNG"); - return 1; -} - -typedef struct { - stbi__context * s; - stbi_uc *idata, *expanded, *out; - int depth; -} stbi__png; - -enum { - STBI__F_none = 0, - STBI__F_sub = 1, - STBI__F_up = 2, - STBI__F_avg = 3, - STBI__F_paeth = 4, - // synthetic filters used for first scanline to avoid needing a dummy row of 0s - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static stbi_uc first_row_filter[5] = {STBI__F_none, STBI__F_sub, STBI__F_none, STBI__F_avg_first, STBI__F_paeth_first}; - -static int stbi__paeth(int a, int b, int c) { - int p = a + b - c; - int pa = abs(p - a); - int pb = abs(p - b); - int pc = abs(p - c); - if (pa <= pb && pa <= pc) - return a; - if (pb <= pc) - return b; - return c; -} - -static const stbi_uc stbi__depth_scale_table[9] = {0, 0xff, 0x55, 0, 0x11, 0, 0, 0, 0x01}; - -// create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png * a, stbi_uc * raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, - stbi__uint32 y, int depth, int color) { - int bytes = (depth == 16 ? 2 : 1); - stbi__context * s = a->s; - stbi__uint32 i, j, stride = x * out_n * bytes; - stbi__uint32 img_len, img_width_bytes; - int k; - int img_n = s->img_n; // copy it into a local for later - - int output_bytes = out_n * bytes; - int filter_bytes = img_n * bytes; - int width = x; - - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1); - a->out = (stbi_uc *)stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into - if (!a->out) - return stbi__err("outofmem", "Out of memory"); - - if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) - return stbi__err("too large", "Corrupt PNG"); - img_width_bytes = (((img_n * x * depth) + 7) >> 3); - img_len = (img_width_bytes + 1) * y; - - // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, - // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), - // so just check for raw_len < img_len always. - if (raw_len < img_len) - return stbi__err("not enough pixels", "Corrupt PNG"); - - for (j = 0; j < y; ++j) { - stbi_uc * cur = a->out + stride * j; - stbi_uc * prior; - int filter = *raw++; - - if (filter > 4) - return stbi__err("invalid filter", "Corrupt PNG"); - - if (depth < 8) { - if (img_width_bytes > x) - return stbi__err("invalid width", "Corrupt PNG"); - cur += x * out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place - filter_bytes = 1; - width = img_width_bytes; - } - prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above - - // if first row, use special filter that doesn't sample previous row - if (j == 0) - filter = first_row_filter[filter]; - - // handle first byte explicitly - for (k = 0; k < filter_bytes; ++k) { - switch (filter) { - case STBI__F_none: - cur[k] = raw[k]; - break; - case STBI__F_sub: - cur[k] = raw[k]; - break; - case STBI__F_up: - cur[k] = STBI__BYTECAST(raw[k] + prior[k]); - break; - case STBI__F_avg: - cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1)); - break; - case STBI__F_paeth: - cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0)); - break; - case STBI__F_avg_first: - cur[k] = raw[k]; - break; - case STBI__F_paeth_first: - cur[k] = raw[k]; - break; - } - } - - if (depth == 8) { - if (img_n != out_n) - cur[img_n] = 255; // first pixel - raw += img_n; - cur += out_n; - prior += out_n; - } else if (depth == 16) { - if (img_n != out_n) { - cur[filter_bytes] = 255; // first pixel top byte - cur[filter_bytes + 1] = 255; // first pixel bottom byte - } - raw += filter_bytes; - cur += output_bytes; - prior += output_bytes; - } else { - raw += 1; - cur += 1; - prior += 1; - } - - // this is a little gross, so that we don't switch per-pixel or per-component - if (depth < 8 || img_n == out_n) { - int nk = (width - 1) * filter_bytes; -#define STBI__CASE(f) \ - case f: \ - for (k = 0; k < nk; ++k) - switch (filter) { - // "none" filter turns into a memcpy here; make that explicit. - case STBI__F_none: - memcpy(cur, raw, nk); - break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); } - break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } - break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); } - break; - STBI__CASE(STBI__F_paeth) { - cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); - } - break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); } - break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); } - break; - } -#undef STBI__CASE - raw += nk; - } else { - STBI_ASSERT(img_n + 1 == out_n); -#define STBI__CASE(f) \ - case f: \ - for (i = x - 1; i >= 1; --i, cur[filter_bytes] = 255, raw += filter_bytes, cur += output_bytes, prior += output_bytes) \ - for (k = 0; k < filter_bytes; ++k) - switch (filter) { - STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } - break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]); } - break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } - break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1)); } - break; - STBI__CASE(STBI__F_paeth) { - cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes])); - } - break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1)); } - break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0)); } - break; - } -#undef STBI__CASE - - // the loop above sets the high byte of the pixels' alpha, but for - // 16 bit png files we also need the low byte set. we'll do that here. - if (depth == 16) { - cur = a->out + stride * j; // start at the beginning of the row again - for (i = 0; i < x; ++i, cur += output_bytes) { - cur[filter_bytes + 1] = 255; - } - } - } - } - - // we make a separate pass to expand bits to pixels; for performance, - // this could run two scanlines behind the above code, so it won't - // intefere with filtering but will still be in the cache. - if (depth < 8) { - for (j = 0; j < y; ++j) { - stbi_uc * cur = a->out + stride * j; - stbi_uc * in = a->out + stride * j + x * out_n - img_width_bytes; - // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for - // 1/2/4-bit png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that - // will be skipped in the later loop - stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range - - // note that the final byte might overshoot and write more data than desired. - // we can allocate enough data that this never writes out of memory, but it - // could also overwrite the next scanline. can it overwrite non-empty data - // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. - // so we need to explicitly clamp the final ones - - if (depth == 4) { - for (k = x * img_n; k >= 2; k -= 2, ++in) { - *cur++ = scale * ((*in >> 4)); - *cur++ = scale * ((*in) & 0x0f); - } - if (k > 0) - *cur++ = scale * ((*in >> 4)); - } else if (depth == 2) { - for (k = x * img_n; k >= 4; k -= 4, ++in) { - *cur++ = scale * ((*in >> 6)); - *cur++ = scale * ((*in >> 4) & 0x03); - *cur++ = scale * ((*in >> 2) & 0x03); - *cur++ = scale * ((*in) & 0x03); - } - if (k > 0) - *cur++ = scale * ((*in >> 6)); - if (k > 1) - *cur++ = scale * ((*in >> 4) & 0x03); - if (k > 2) - *cur++ = scale * ((*in >> 2) & 0x03); - } else if (depth == 1) { - for (k = x * img_n; k >= 8; k -= 8, ++in) { - *cur++ = scale * ((*in >> 7)); - *cur++ = scale * ((*in >> 6) & 0x01); - *cur++ = scale * ((*in >> 5) & 0x01); - *cur++ = scale * ((*in >> 4) & 0x01); - *cur++ = scale * ((*in >> 3) & 0x01); - *cur++ = scale * ((*in >> 2) & 0x01); - *cur++ = scale * ((*in >> 1) & 0x01); - *cur++ = scale * ((*in) & 0x01); - } - if (k > 0) - *cur++ = scale * ((*in >> 7)); - if (k > 1) - *cur++ = scale * ((*in >> 6) & 0x01); - if (k > 2) - *cur++ = scale * ((*in >> 5) & 0x01); - if (k > 3) - *cur++ = scale * ((*in >> 4) & 0x01); - if (k > 4) - *cur++ = scale * ((*in >> 3) & 0x01); - if (k > 5) - *cur++ = scale * ((*in >> 2) & 0x01); - if (k > 6) - *cur++ = scale * ((*in >> 1) & 0x01); - } - if (img_n != out_n) { - int q; - // insert alpha = 255 - cur = a->out + stride * j; - if (img_n == 1) { - for (q = x - 1; q >= 0; --q) { - cur[q * 2 + 1] = 255; - cur[q * 2 + 0] = cur[q]; - } - } else { - STBI_ASSERT(img_n == 3); - for (q = x - 1; q >= 0; --q) { - cur[q * 4 + 3] = 255; - cur[q * 4 + 2] = cur[q * 3 + 2]; - cur[q * 4 + 1] = cur[q * 3 + 1]; - cur[q * 4 + 0] = cur[q * 3 + 0]; - } - } - } - } - } else if (depth == 16) { - // force the image data from big-endian to platform-native. - // this is done in a separate pass due to the decoding relying - // on the data being untouched, but could probably be done - // per-line during decode if care is taken. - stbi_uc * cur = a->out; - stbi__uint16 * cur16 = (stbi__uint16 *)cur; - - for (i = 0; i < x * y * out_n; ++i, cur16++, cur += 2) { - *cur16 = (cur[0] << 8) | cur[1]; - } - } - - return 1; -} - -static int stbi__create_png_image(stbi__png * a, stbi_uc * image_data, stbi__uint32 image_data_len, int out_n, int depth, - int color, int interlaced) { - int bytes = (depth == 16 ? 2 : 1); - int out_bytes = out_n * bytes; - stbi_uc * final; - int p; - if (!interlaced) - return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); - - // de-interlacing - final = (stbi_uc *)stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); - if (!final) - return stbi__err("outofmem", "Out of memory"); - for (p = 0; p < 7; ++p) { - int xorig[] = {0, 4, 0, 2, 0, 1, 0}; - int yorig[] = {0, 0, 4, 0, 2, 0, 1}; - int xspc[] = {8, 8, 4, 4, 2, 2, 1}; - int yspc[] = {8, 8, 8, 4, 4, 2, 2}; - int i, j, x, y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p]; - if (x && y) { - stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; - if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { - STBI_FREE(final); - return 0; - } - for (j = 0; j < y; ++j) { - for (i = 0; i < x; ++i) { - int out_y = j * yspc[p] + yorig[p]; - int out_x = i * xspc[p] + xorig[p]; - memcpy(final + out_y * a->s->img_x * out_bytes + out_x * out_bytes, a->out + (j * x + i) * out_bytes, - out_bytes); - } - } - STBI_FREE(a->out); - image_data += img_len; - image_data_len -= img_len; - } - } - a->out = final; - - return 1; -} - -static int stbi__compute_transparency(stbi__png * z, stbi_uc tc[3], int out_n) { - stbi__context * s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc * p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__compute_transparency16(stbi__png * z, stbi__uint16 tc[3], int out_n) { - stbi__context * s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi__uint16 * p = (stbi__uint16 *)z->out; - - // compute color-based transparency, assuming we've - // already got 65535 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 65535); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__expand_png_palette(stbi__png * a, stbi_uc * palette, int len, int pal_img_n) { - stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; - stbi_uc *p, *temp_out, *orig = a->out; - - p = (stbi_uc *)stbi__malloc_mad2(pixel_count, pal_img_n, 0); - if (p == NULL) - return stbi__err("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i = 0; i < pixel_count; ++i) { - int n = orig[i] * 4; - p[0] = palette[n]; - p[1] = palette[n + 1]; - p[2] = palette[n + 2]; - p += 3; - } - } else { - for (i = 0; i < pixel_count; ++i) { - int n = orig[i] * 4; - p[0] = palette[n]; - p[1] = palette[n + 1]; - p[2] = palette[n + 2]; - p[3] = palette[n + 3]; - p += 4; - } - } - STBI_FREE(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi__unpremultiply_on_load_global = 0; -static int stbi__de_iphone_flag_global = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) { - stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) { - stbi__de_iphone_flag_global = flag_true_if_should_convert; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global -#define stbi__de_iphone_flag stbi__de_iphone_flag_global -#else -static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; -static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; - -STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) { - stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; - stbi__unpremultiply_on_load_set = 1; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) { - stbi__de_iphone_flag_local = flag_true_if_should_convert; - stbi__de_iphone_flag_set = 1; -} - -#define stbi__unpremultiply_on_load \ - (stbi__unpremultiply_on_load_set ? stbi__unpremultiply_on_load_local : stbi__unpremultiply_on_load_global) -#define stbi__de_iphone_flag (stbi__de_iphone_flag_set ? stbi__de_iphone_flag_local : stbi__de_iphone_flag_global) -#endif // STBI_THREAD_LOCAL - -static void stbi__de_iphone(stbi__png * z) { - stbi__context * s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc * p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i = 0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - STBI_ASSERT(s->img_out_n == 4); - if (stbi__unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i = 0; i < pixel_count; ++i) { - stbi_uc a = p[3]; - stbi_uc t = p[0]; - if (a) { - stbi_uc half = a / 2; - p[0] = (p[2] * 255 + half) / a; - p[1] = (p[1] * 255 + half) / a; - p[2] = (t * 255 + half) / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i = 0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -#define STBI__PNG_TYPE(a, b, c, d) (((unsigned)(a) << 24) + ((unsigned)(b) << 16) + ((unsigned)(c) << 8) + (unsigned)(d)) - -static int stbi__parse_png_file(stbi__png * z, int scan, int req_comp) { - stbi_uc palette[1024], pal_img_n = 0; - stbi_uc has_trans = 0, tc[3] = {0}; - stbi__uint16 tc16[3]; - stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0; - int first = 1, k, interlace = 0, color = 0, is_iphone = 0; - stbi__context * s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!stbi__check_png_header(s)) - return 0; - - if (scan == STBI__SCAN_type) - return 1; - - for (;;) { - stbi__pngchunk c = stbi__get_chunk_header(s); - switch (c.type) { - case STBI__PNG_TYPE('C', 'g', 'B', 'I'): - is_iphone = 1; - stbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I', 'H', 'D', 'R'): { - int comp, filter; - if (!first) - return stbi__err("multiple IHDR", "Corrupt PNG"); - first = 0; - if (c.length != 13) - return stbi__err("bad IHDR len", "Corrupt PNG"); - s->img_x = stbi__get32be(s); - s->img_y = stbi__get32be(s); - if (s->img_y > STBI_MAX_DIMENSIONS) - return stbi__err("too large", "Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) - return stbi__err("too large", "Very large image (corrupt?)"); - z->depth = stbi__get8(s); - if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) - return stbi__err("1/2/4/8/16-bit only", "PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); - if (color > 6) - return stbi__err("bad ctype", "Corrupt PNG"); - if (color == 3 && z->depth == 16) - return stbi__err("bad ctype", "Corrupt PNG"); - if (color == 3) - pal_img_n = 3; - else if (color & 1) - return stbi__err("bad ctype", "Corrupt PNG"); - comp = stbi__get8(s); - if (comp) - return stbi__err("bad comp method", "Corrupt PNG"); - filter = stbi__get8(s); - if (filter) - return stbi__err("bad filter method", "Corrupt PNG"); - interlace = stbi__get8(s); - if (interlace > 1) - return stbi__err("bad interlace method", "Corrupt PNG"); - if (!s->img_x || !s->img_y) - return stbi__err("0-pixel image", "Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) - return stbi__err("too large", "Image too large to decode"); - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) - return stbi__err("too large", "Corrupt PNG"); - } - // even with SCAN_header, have to scan to see if we have a tRNS - break; - } - - case STBI__PNG_TYPE('P', 'L', 'T', 'E'): { - if (first) - return stbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256 * 3) - return stbi__err("invalid PLTE", "Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) - return stbi__err("invalid PLTE", "Corrupt PNG"); - for (i = 0; i < pal_len; ++i) { - palette[i * 4 + 0] = stbi__get8(s); - palette[i * 4 + 1] = stbi__get8(s); - palette[i * 4 + 2] = stbi__get8(s); - palette[i * 4 + 3] = 255; - } - break; - } - - case STBI__PNG_TYPE('t', 'R', 'N', 'S'): { - if (first) - return stbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) - return stbi__err("tRNS after IDAT", "Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { - s->img_n = 4; - return 1; - } - if (pal_len == 0) - return stbi__err("tRNS before PLTE", "Corrupt PNG"); - if (c.length > pal_len) - return stbi__err("bad tRNS len", "Corrupt PNG"); - pal_img_n = 4; - for (i = 0; i < c.length; ++i) - palette[i * 4 + 3] = stbi__get8(s); - } else { - if (!(s->img_n & 1)) - return stbi__err("tRNS with alpha", "Corrupt PNG"); - if (c.length != (stbi__uint32)s->img_n * 2) - return stbi__err("bad tRNS len", "Corrupt PNG"); - has_trans = 1; - // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. - if (scan == STBI__SCAN_header) { - ++s->img_n; - return 1; - } - if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) - tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is - } else { - for (k = 0; k < s->img_n; ++k) - tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * - stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger - } - } - break; - } - - case STBI__PNG_TYPE('I', 'D', 'A', 'T'): { - if (first) - return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) - return stbi__err("no PLTE", "Corrupt PNG"); - if (scan == STBI__SCAN_header) { - // header scan definitely stops at first IDAT - if (pal_img_n) - s->img_n = pal_img_n; - return 1; - } - if (c.length > (1u << 30)) - return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); - if ((int)(ioff + c.length) < (int)ioff) - return 0; - if (ioff + c.length > idata_limit) { - stbi__uint32 idata_limit_old = idata_limit; - stbi_uc * p; - if (idata_limit == 0) - idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (stbi_uc *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); - if (p == NULL) - return stbi__err("outofmem", "Out of memory"); - z->idata = p; - } - if (!stbi__getn(s, z->idata + ioff, c.length)) - return stbi__err("outofdata", "Corrupt PNG"); - ioff += c.length; - break; - } - - case STBI__PNG_TYPE('I', 'E', 'N', 'D'): { - stbi__uint32 raw_len, bpl; - if (first) - return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) - return 1; - if (z->idata == NULL) - return stbi__err("no IDAT", "Corrupt PNG"); - // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (stbi_uc *)stbi_zlib_decode_malloc_guesssize_headerflag((char *)z->idata, ioff, raw_len, - (int *)&raw_len, !is_iphone); - if (z->expanded == NULL) - return 0; // zlib should set error - STBI_FREE(z->idata); - z->idata = NULL; - if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n + 1; - else - s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) - return 0; - if (has_trans) { - if (z->depth == 16) { - if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) - return 0; - } else { - if (!stbi__compute_transparency(z, tc, s->img_out_n)) - return 0; - } - } - if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) - stbi__de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) - s->img_out_n = req_comp; - if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - // non-paletted image with tRNS -> source image has (constant) alpha - ++s->img_n; - } - STBI_FREE(z->expanded); - z->expanded = NULL; - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - return 1; - } - - default: - // if critical, fail - if (first) - return stbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { -#ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX PNG chunk not known"; - invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); - invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); - invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); - invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); -#endif - return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); - } - stbi__skip(s, c.length); - break; - } - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - } -} - -static void * stbi__do_png(stbi__png * p, int * x, int * y, int * n, int req_comp, stbi__result_info * ri) { - void * result = NULL; - if (req_comp < 0 || req_comp > 4) - return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth <= 8) - ri->bits_per_channel = 8; - else if (p->depth == 16) - ri->bits_per_channel = 16; - else - return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - if (ri->bits_per_channel == 8) - result = stbi__convert_format((unsigned char *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - else - result = stbi__convert_format16((stbi__uint16 *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) - return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) - *n = p->s->img_n; - } - STBI_FREE(p->out); - p->out = NULL; - STBI_FREE(p->expanded); - p->expanded = NULL; - STBI_FREE(p->idata); - p->idata = NULL; - - return result; -} - -static void * stbi__png_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { - stbi__png p; - p.s = s; - return stbi__do_png(&p, x, y, comp, req_comp, ri); -} - -static int stbi__png_test(stbi__context * s) { - int r; - r = stbi__check_png_header(s); - stbi__rewind(s); - return r; -} - -static int stbi__png_info_raw(stbi__png * p, int * x, int * y, int * comp) { - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind(p->s); - return 0; - } - if (x) - *x = p->s->img_x; - if (y) - *y = p->s->img_y; - if (comp) - *comp = p->s->img_n; - return 1; -} - -static int stbi__png_info(stbi__context * s, int * x, int * y, int * comp) { - stbi__png p; - p.s = s; - return stbi__png_info_raw(&p, x, y, comp); -} - -static int stbi__png_is16(stbi__context * s) { - stbi__png p; - p.s = s; - if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); - return 0; - } - return 1; -} -#endif - -// Microsoft/Windows BMP image - -#ifndef STBI_NO_BMP -static int stbi__bmp_test_raw(stbi__context * s) { - int r; - int sz; - if (stbi__get8(s) != 'B') - return 0; - if (stbi__get8(s) != 'M') - return 0; - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - stbi__get32le(s); // discard data offset - sz = stbi__get32le(s); - r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); - return r; -} - -static int stbi__bmp_test(stbi__context * s) { - int r = stbi__bmp_test_raw(s); - stbi__rewind(s); - return r; -} - -// returns 0..31 for the highest set bit -static int stbi__high_bit(unsigned int z) { - int n = 0; - if (z == 0) - return -1; - if (z >= 0x10000) { - n += 16; - z >>= 16; - } - if (z >= 0x00100) { - n += 8; - z >>= 8; - } - if (z >= 0x00010) { - n += 4; - z >>= 4; - } - if (z >= 0x00004) { - n += 2; - z >>= 2; - } - if (z >= 0x00002) { - n += 1; /* >>= 1;*/ - } - return n; -} - -static int stbi__bitcount(unsigned int a) { - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -// extract an arbitrarily-aligned N-bit value (N=bits) -// from v, and then make it 8-bits long and fractionally -// extend it to full full range. -static int stbi__shiftsigned(unsigned int v, int shift, int bits) { - static unsigned int mul_table[9] = { - 0, - 0xff /*0b11111111*/, - 0x55 /*0b01010101*/, - 0x49 /*0b01001001*/, - 0x11 /*0b00010001*/, - 0x21 /*0b00100001*/, - 0x41 /*0b01000001*/, - 0x81 /*0b10000001*/, - 0x01 /*0b00000001*/, - }; - static unsigned int shift_table[9] = { - 0, 0, 0, 1, 0, 2, 4, 6, 0, - }; - if (shift < 0) - v <<= -shift; - else - v >>= shift; - STBI_ASSERT(v < 256); - v >>= (8 - bits); - STBI_ASSERT(bits >= 0 && bits <= 8); - return (int)((unsigned)v * mul_table[bits]) >> shift_table[bits]; -} - -typedef struct { - int bpp, offset, hsz; - unsigned int mr, mg, mb, ma, all_a; - int extra_read; -} stbi__bmp_data; - -static int stbi__bmp_set_mask_defaults(stbi__bmp_data * info, int compress) { - // BI_BITFIELDS specifies masks explicitly, don't override - if (compress == 3) - return 1; - - if (compress == 0) { - if (info->bpp == 16) { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } else if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - // otherwise, use defaults, which is all-0 - info->mr = info->mg = info->mb = info->ma = 0; - } - return 1; - } - return 0; // error -} - -static void * stbi__bmp_parse_header(stbi__context * s, stbi__bmp_data * info) { - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') - return stbi__errpuc("not BMP", "Corrupt BMP"); - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; - info->extra_read = 14; - - if (info->offset < 0) - return stbi__errpuc("bad BMP", "bad BMP"); - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) - return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = stbi__get16le(s); - s->img_y = stbi__get16le(s); - } else { - s->img_x = stbi__get32le(s); - s->img_y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) - return stbi__errpuc("bad BMP", "bad BMP"); - info->bpp = stbi__get16le(s); - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) - return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); - if (compress >= 4) - return stbi__errpuc("BMP JPEG/PNG", - "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes - if (compress == 3 && info->bpp != 16 && info->bpp != 32) - return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres - stbi__get32le(s); // discard colorsused - stbi__get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { - stbi__bmp_set_mask_defaults(info, compress); - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->extra_read += 12; - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { - // V4/V5 header - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); - if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs - stbi__bmp_set_mask_defaults(info, compress); - stbi__get32le(s); // discard color space - for (i = 0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters - if (hsz == 124) { - stbi__get32le(s); // discard rendering intent - stbi__get32le(s); // discard offset of profile data - stbi__get32le(s); // discard size of profile data - stbi__get32le(s); // discard reserved - } - } - } - return (void *)1; -} - -static void * stbi__bmp_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { - stbi_uc * out; - unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a; - stbi_uc pal[256][4]; - int psize = 0, i, j, width; - int flip_vertically, pad, target; - stbi__bmp_data info; - STBI_NOTUSED(ri); - - info.all_a = 255; - if (stbi__bmp_parse_header(s, &info) == NULL) - return NULL; // error code already set - - flip_vertically = ((int)s->img_y) > 0; - s->img_y = abs((int)s->img_y); - - if (s->img_y > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - - mr = info.mr; - mg = info.mg; - mb = info.mb; - ma = info.ma; - all_a = info.all_a; - - if (info.hsz == 12) { - if (info.bpp < 24) - psize = (info.offset - info.extra_read - 24) / 3; - } else { - if (info.bpp < 16) - psize = (info.offset - info.extra_read - info.hsz) >> 2; - } - if (psize == 0) { - // accept some number of extra bytes after the header, but if the offset points either to before - // the header ends or implies a large amount of extra data, reject the file as malformed - int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); - int header_limit = 1024; // max we actually read is below 256 bytes currently. - int extra_data_limit = 256 * 4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. - if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { - return stbi__errpuc("bad header", "Corrupt BMP"); - } - // we established that bytes_read_so_far is positive and sensible. - // the first half of this test rejects offsets that are either too small positives, or - // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn - // ensures the number computed in the second half of the test can't overflow. - if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { - return stbi__errpuc("bad offset", "Corrupt BMP"); - } else { - stbi__skip(s, info.offset - bytes_read_so_far); - } - } - - if (info.bpp == 24 && ma == 0xff000000) - s->img_n = 3; - else - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - - // sanity-check size - if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "Corrupt BMP"); - - out = (stbi_uc *)stbi__malloc_mad3(target, s->img_x, s->img_y, 0); - if (!out) - return stbi__errpuc("outofmem", "Out of memory"); - if (info.bpp < 16) { - int z = 0; - if (psize == 0 || psize > 256) { - STBI_FREE(out); - return stbi__errpuc("invalid", "Corrupt BMP"); - } - for (i = 0; i < psize; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - if (info.hsz != 12) - stbi__get8(s); - pal[i][3] = 255; - } - stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 1) - width = (s->img_x + 7) >> 3; - else if (info.bpp == 4) - width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) - width = s->img_x; - else { - STBI_FREE(out); - return stbi__errpuc("bad bpp", "Corrupt BMP"); - } - pad = (-width) & 3; - if (info.bpp == 1) { - for (j = 0; j < (int)s->img_y; ++j) { - int bit_offset = 7, v = stbi__get8(s); - for (i = 0; i < (int)s->img_x; ++i) { - int color = (v >> bit_offset) & 0x1; - out[z++] = pal[color][0]; - out[z++] = pal[color][1]; - out[z++] = pal[color][2]; - if (target == 4) - out[z++] = 255; - if (i + 1 == (int)s->img_x) - break; - if ((--bit_offset) < 0) { - bit_offset = 7; - v = stbi__get8(s); - } - } - stbi__skip(s, pad); - } - } else { - for (j = 0; j < (int)s->img_y; ++j) { - for (i = 0; i < (int)s->img_x; i += 2) { - int v = stbi__get8(s), v2 = 0; - if (info.bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) - out[z++] = 255; - if (i + 1 == (int)s->img_x) - break; - v = (info.bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) - out[z++] = 255; - } - stbi__skip(s, pad); - } - } - } else { - int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0; - int z = 0; - int easy = 0; - stbi__skip(s, info.offset - info.extra_read - info.hsz); - if (info.bpp == 24) - width = 3 * s->img_x; - else if (info.bpp == 16) - width = 2 * s->img_x; - else /* bpp = 32 and pad = 0 */ - width = 0; - pad = (-width) & 3; - if (info.bpp == 24) { - easy = 1; - } else if (info.bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { - STBI_FREE(out); - return stbi__errpuc("bad masks", "Corrupt BMP"); - } - // right shift amt to put high bit in position #7 - rshift = stbi__high_bit(mr) - 7; - rcount = stbi__bitcount(mr); - gshift = stbi__high_bit(mg) - 7; - gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb) - 7; - bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma) - 7; - acount = stbi__bitcount(ma); - if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { - STBI_FREE(out); - return stbi__errpuc("bad masks", "Corrupt BMP"); - } - } - for (j = 0; j < (int)s->img_y; ++j) { - if (easy) { - for (i = 0; i < (int)s->img_x; ++i) { - unsigned char a; - out[z + 2] = stbi__get8(s); - out[z + 1] = stbi__get8(s); - out[z + 0] = stbi__get8(s); - z += 3; - a = (easy == 2 ? stbi__get8(s) : 255); - all_a |= a; - if (target == 4) - out[z++] = a; - } - } else { - int bpp = info.bpp; - for (i = 0; i < (int)s->img_x; ++i) { - stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s)); - unsigned int a; - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); - a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - all_a |= a; - if (target == 4) - out[z++] = STBI__BYTECAST(a); - } - } - stbi__skip(s, pad); - } - } - - // if alpha channel is all 0s, replace with all 255s - if (target == 4 && all_a == 0) - for (i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4) - out[i] = 255; - - if (flip_vertically) { - stbi_uc t; - for (j = 0; j < (int)s->img_y >> 1; ++j) { - stbi_uc * p1 = out + j * s->img_x * target; - stbi_uc * p2 = out + (s->img_y - 1 - j) * s->img_x * target; - for (i = 0; i < (int)s->img_x * target; ++i) { - t = p1[i]; - p1[i] = p2[i]; - p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) - return out; // stbi__convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) - *comp = s->img_n; - return out; -} -#endif - -// Targa Truevision - TGA -// by Jonathan Dummer -#ifndef STBI_NO_TGA -// returns STBI_rgb or whatever, 0 on error -static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int * is_rgb16) { - // only RGB or RGBA (incl. 16bit) or grey allowed - if (is_rgb16) - *is_rgb16 = 0; - switch (bits_per_pixel) { - case 8: - return STBI_grey; - case 16: - if (is_grey) - return STBI_grey_alpha; - // fallthrough - case 15: - if (is_rgb16) - *is_rgb16 = 1; - return STBI_rgb; - case 24: // fallthrough - case 32: - return bits_per_pixel / 8; - default: - return 0; - } -} - -static int stbi__tga_info(stbi__context * s, int * x, int * y, int * comp) { - int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; - int sz, tga_colormap_type; - stbi__get8(s); // discard Offset - tga_colormap_type = stbi__get8(s); // colormap type - if (tga_colormap_type > 1) { - stbi__rewind(s); - return 0; // only RGB or indexed allowed - } - tga_image_type = stbi__get8(s); // image type - if (tga_colormap_type == 1) { // colormapped (paletted) image - if (tga_image_type != 1 && tga_image_type != 9) { - stbi__rewind(s); - return 0; - } - stbi__skip(s, 4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) { - stbi__rewind(s); - return 0; - } - stbi__skip(s, 4); // skip image x and y origin - tga_colormap_bpp = sz; - } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE - if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) { - stbi__rewind(s); - return 0; // only RGB or grey allowed, +/- RLE - } - stbi__skip(s, 9); // skip colormap specification and image x/y origin - tga_colormap_bpp = 0; - } - tga_w = stbi__get16le(s); - if (tga_w < 1) { - stbi__rewind(s); - return 0; // test width - } - tga_h = stbi__get16le(s); - if (tga_h < 1) { - stbi__rewind(s); - return 0; // test height - } - tga_bits_per_pixel = stbi__get8(s); // bits per pixel - stbi__get8(s); // ignore alpha bits - if (tga_colormap_bpp != 0) { - if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { - // when using a colormap, tga_bits_per_pixel is the size of the indexes - // I don't think anything but 8 or 16bit indexes makes sense - stbi__rewind(s); - return 0; - } - tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); - } else { - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); - } - if (!tga_comp) { - stbi__rewind(s); - return 0; - } - if (x) - *x = tga_w; - if (y) - *y = tga_h; - if (comp) - *comp = tga_comp; - return 1; // seems to have passed everything -} - -static int stbi__tga_test(stbi__context * s) { - int res = 0; - int sz, tga_color_type; - stbi__get8(s); // discard Offset - tga_color_type = stbi__get8(s); // color type - if (tga_color_type > 1) - goto errorEnd; // only RGB or indexed allowed - sz = stbi__get8(s); // image type - if (tga_color_type == 1) { // colormapped (paletted) image - if (sz != 1 && sz != 9) - goto errorEnd; // colortype 1 demands image type 1 or 9 - stbi__skip(s, 4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) - goto errorEnd; - stbi__skip(s, 4); // skip image x and y origin - } else { // "normal" image w/o colormap - if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11)) - goto errorEnd; // only RGB or grey allowed, +/- RLE - stbi__skip(s, 9); // skip colormap specification and image x/y origin - } - if (stbi__get16le(s) < 1) - goto errorEnd; // test width - if (stbi__get16le(s) < 1) - goto errorEnd; // test height - sz = stbi__get8(s); // bits per pixel - if ((tga_color_type == 1) && (sz != 8) && (sz != 16)) - goto errorEnd; // for colormapped images, bpp is size of an index - if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) - goto errorEnd; - - res = 1; // if we got this far, everything's good and we can return 1 instead of 0 - -errorEnd: - stbi__rewind(s); - return res; -} - -// read 16bit value and convert to 24bit RGB -static void stbi__tga_read_rgb16(stbi__context * s, stbi_uc * out) { - stbi__uint16 px = (stbi__uint16)stbi__get16le(s); - stbi__uint16 fiveBitMask = 31; - // we have 3 channels with 5bits each - int r = (px >> 10) & fiveBitMask; - int g = (px >> 5) & fiveBitMask; - int b = px & fiveBitMask; - // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (stbi_uc)((r * 255) / 31); - out[1] = (stbi_uc)((g * 255) / 31); - out[2] = (stbi_uc)((b * 255) / 31); - - // some people claim that the most significant bit might be used for alpha - // (possibly if an alpha-bit is set in the "image descriptor byte") - // but that only made 16bit test images completely translucent.. - // so let's treat all 15 and 16bit TGAs as RGB with no alpha. -} - -static void * stbi__tga_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { - // read in the TGA header stuff - int tga_offset = stbi__get8(s); - int tga_indexed = stbi__get8(s); - int tga_image_type = stbi__get8(s); - int tga_is_RLE = 0; - int tga_palette_start = stbi__get16le(s); - int tga_palette_len = stbi__get16le(s); - int tga_palette_bits = stbi__get8(s); - int tga_x_origin = stbi__get16le(s); - int tga_y_origin = stbi__get16le(s); - int tga_width = stbi__get16le(s); - int tga_height = stbi__get16le(s); - int tga_bits_per_pixel = stbi__get8(s); - int tga_comp, tga_rgb16 = 0; - int tga_inverted = stbi__get8(s); - // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) - // image data - unsigned char * tga_data; - unsigned char * tga_palette = NULL; - int i, j; - unsigned char raw_data[4] = {0}; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); - STBI_NOTUSED(tga_x_origin); // @TODO - STBI_NOTUSED(tga_y_origin); // @TODO - - if (tga_height > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - if (tga_width > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - - // do a tiny bit of precessing - if (tga_image_type >= 8) { - tga_image_type -= 8; - tga_is_RLE = 1; - } - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // If I'm paletted, then I'll use the number of bits from the palette - if (tga_indexed) - tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); - else - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); - - if (!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency - return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); - - // tga info - *x = tga_width; - *y = tga_height; - if (comp) - *comp = tga_comp; - - if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) - return stbi__errpuc("too large", "Corrupt TGA"); - - tga_data = (unsigned char *)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); - if (!tga_data) - return stbi__errpuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - stbi__skip(s, tga_offset); - - if (!tga_indexed && !tga_is_RLE && !tga_rgb16) { - for (i = 0; i < tga_height; ++i) { - int row = tga_inverted ? tga_height - i - 1 : i; - stbi_uc * tga_row = tga_data + row * tga_width * tga_comp; - stbi__getn(s, tga_row, tga_width * tga_comp); - } - } else { - // do I need to load a palette? - if (tga_indexed) { - if (tga_palette_len == 0) { /* you have to have at least one entry! */ - STBI_FREE(tga_data); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start); - // load the palette - tga_palette = (unsigned char *)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); - if (!tga_palette) { - STBI_FREE(tga_data); - return stbi__errpuc("outofmem", "Out of memory"); - } - if (tga_rgb16) { - stbi_uc * pal_entry = tga_palette; - STBI_ASSERT(tga_comp == STBI_rgb); - for (i = 0; i < tga_palette_len; ++i) { - stbi__tga_read_rgb16(s, pal_entry); - pal_entry += tga_comp; - } - } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - } - // load the data - for (i = 0; i < tga_width * tga_height; ++i) { - // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? - if (tga_is_RLE) { - if (RLE_count == 0) { - // yep, get the next byte as a RLE command - int RLE_cmd = stbi__get8(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if (!RLE_repeating) { - read_next_pixel = 1; - } - } else { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if (read_next_pixel) { - // load however much data we did have - if (tga_indexed) { - // read in index, then perform the lookup - int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); - if (pal_idx >= tga_palette_len) { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_comp; - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = tga_palette[pal_idx + j]; - } - } else if (tga_rgb16) { - STBI_ASSERT(tga_comp == STBI_rgb); - stbi__tga_read_rgb16(s, raw_data); - } else { - // read in the data raw - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = stbi__get8(s); - } - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - - // copy data - for (j = 0; j < tga_comp; ++j) - tga_data[i * tga_comp + j] = raw_data[j]; - - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if (tga_inverted) { - for (j = 0; j * 2 < tga_height; ++j) { - int index1 = j * tga_width * tga_comp; - int index2 = (tga_height - 1 - j) * tga_width * tga_comp; - for (i = tga_width * tga_comp; i > 0; --i) { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if (tga_palette != NULL) { - STBI_FREE(tga_palette); - } - } - - // swap RGB - if the source data was RGB16, it already is in the right order - if (tga_comp >= 3 && !tga_rgb16) { - unsigned char * tga_pixel = tga_data; - for (i = 0; i < tga_width * tga_height; ++i) { - unsigned char temp = tga_pixel[0]; - tga_pixel[0] = tga_pixel[2]; - tga_pixel[2] = temp; - tga_pixel += tga_comp; - } - } - - // convert to target component count - if (req_comp && req_comp != tga_comp) - tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); - - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = tga_x_origin = tga_y_origin = 0; - STBI_NOTUSED(tga_palette_start); - // OK, done - return tga_data; -} -#endif - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context * s) { - int r = (stbi__get32be(s) == 0x38425053); - stbi__rewind(s); - return r; -} - -static int stbi__psd_decode_rle(stbi__context * s, stbi_uc * p, int pixelCount) { - int count, nleft, len; - - count = 0; - while ((nleft = pixelCount - count) > 0) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - if (len > nleft) - return 0; // corrupt data - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len = 257 - len; - if (len > nleft) - return 0; // corrupt data - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - - return 1; -} - -static void * stbi__psd_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, int bpc) { - int pixelCount; - int channelCount, compression; - int channel, i; - int bitdepth; - int w, h; - stbi_uc * out; - STBI_NOTUSED(ri); - - // Check identifier - if (stbi__get32be(s) != 0x38425053) // "8BPS" - return stbi__errpuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (stbi__get16be(s) != 1) - return stbi__errpuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - stbi__skip(s, 6); - - // Read the number of channels (R, G, B, A, etc). - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) - return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = stbi__get32be(s); - w = stbi__get32be(s); - - if (h > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - if (w > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (stbi__get16be(s) != 3) - return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - stbi__skip(s, stbi__get32be(s)); - - // Skip the image resources. (resolution, pen tool paths, etc) - stbi__skip(s, stbi__get32be(s)); - - // Skip the reserved data. - stbi__skip(s, stbi__get32be(s)); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = stbi__get16be(s); - if (compression > 1) - return stbi__errpuc("bad compression", "PSD has an unknown compression format"); - - // Check size - if (!stbi__mad3sizes_valid(4, w, h, 0)) - return stbi__errpuc("too large", "Corrupt PSD"); - - // Create the destination image. - - if (!compression && bitdepth == 16 && bpc == 16) { - out = (stbi_uc *)stbi__malloc_mad3(8, w, h, 0); - ri->bits_per_channel = 16; - } else - out = (stbi_uc *)stbi__malloc(4 * w * h); - - if (!out) - return stbi__errpuc("outofmem", "Out of memory"); - pixelCount = w * h; - - // Initialize the data to zero. - // memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - stbi_uc * p; - - p = out + channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = (channel == 3 ? 255 : 0); - } else { - // Read the RLE data. - if (!stbi__psd_decode_rle(s, p, pixelCount)) { - STBI_FREE(out); - return stbi__errpuc("corrupt", "bad RLE data"); - } - } - } - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - if (channel >= channelCount) { - // Fill this channel with default data. - if (bitdepth == 16 && bpc == 16) { - stbi__uint16 * q = ((stbi__uint16 *)out) + channel; - stbi__uint16 val = channel == 3 ? 65535 : 0; - for (i = 0; i < pixelCount; i++, q += 4) - *q = val; - } else { - stbi_uc * p = out + channel; - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } - } else { - if (ri->bits_per_channel == 16) { // output bpc - stbi__uint16 * q = ((stbi__uint16 *)out) + channel; - for (i = 0; i < pixelCount; i++, q += 4) - *q = (stbi__uint16)stbi__get16be(s); - } else { - stbi_uc * p = out + channel; - if (bitdepth == 16) { // input bpc - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc)(stbi__get16be(s) >> 8); - } else { - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); - } - } - } - } - } - - // remove weird white matte from PSD - if (channelCount >= 4) { - if (ri->bits_per_channel == 16) { - for (i = 0; i < w * h; ++i) { - stbi__uint16 * pixel = (stbi__uint16 *)out + 4 * i; - if (pixel[3] != 0 && pixel[3] != 65535) { - float a = pixel[3] / 65535.0f; - float ra = 1.0f / a; - float inv_a = 65535.0f * (1 - ra); - pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a); - pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a); - pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a); - } - } - } else { - for (i = 0; i < w * h; ++i) { - unsigned char * pixel = out + 4 * i; - if (pixel[3] != 0 && pixel[3] != 255) { - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char)(pixel[0] * ra + inv_a); - pixel[1] = (unsigned char)(pixel[1] * ra + inv_a); - pixel[2] = (unsigned char)(pixel[2] * ra + inv_a); - } - } - } - } - - // convert to desired output format - if (req_comp && req_comp != 4) { - if (ri->bits_per_channel == 16) - out = (stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, 4, req_comp, w, h); - else - out = stbi__convert_format(out, 4, req_comp, w, h); - if (out == NULL) - return out; // stbi__convert_format frees input on failure - } - - if (comp) - *comp = 4; - *y = h; - *x = w; - - return out; -} -#endif - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -#ifndef STBI_NO_PIC -static int stbi__pic_is4(stbi__context * s, const char * str) { - int i; - for (i = 0; i < 4; ++i) - if (stbi__get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int stbi__pic_test_core(stbi__context * s) { - int i; - - if (!stbi__pic_is4(s, "\x53\x80\xF6\x34")) - return 0; - - for (i = 0; i < 84; ++i) - stbi__get8(s); - - if (!stbi__pic_is4(s, "PICT")) - return 0; - - return 1; -} - -typedef struct { - stbi_uc size, type, channel; -} stbi__pic_packet; - -static stbi_uc * stbi__readval(stbi__context * s, int channel, stbi_uc * dest) { - int mask = 0x80, i; - - for (i = 0; i < 4; ++i, mask >>= 1) { - if (channel & mask) { - if (stbi__at_eof(s)) - return stbi__errpuc("bad file", "PIC file too short"); - dest[i] = stbi__get8(s); - } - } - - return dest; -} - -static void stbi__copyval(int channel, stbi_uc * dest, const stbi_uc * src) { - int mask = 0x80, i; - - for (i = 0; i < 4; ++i, mask >>= 1) - if (channel & mask) - dest[i] = src[i]; -} - -static stbi_uc * stbi__pic_load_core(stbi__context * s, int width, int height, int * comp, stbi_uc * result) { - int act_comp = 0, num_packets = 0, y, chained; - stbi__pic_packet packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - stbi__pic_packet * packet; - - if (num_packets == sizeof(packets) / sizeof(packets[0])) - return stbi__errpuc("bad format", "too many packets"); - - packet = &packets[num_packets++]; - - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - - act_comp |= packet->channel; - - if (stbi__at_eof(s)) - return stbi__errpuc("bad file", "file too short (reading packets)"); - if (packet->size != 8) - return stbi__errpuc("bad format", "packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for (y = 0; y < height; ++y) { - int packet_idx; - - for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) { - stbi__pic_packet * packet = &packets[packet_idx]; - stbi_uc * dest = result + y * width * 4; - - switch (packet->type) { - default: - return stbi__errpuc("bad format", "packet has bad compression type"); - - case 0: { // uncompressed - int x; - - for (x = 0; x < width; ++x, dest += 4) - if (!stbi__readval(s, packet->channel, dest)) - return 0; - break; - } - - case 1: // Pure RLE - { - int left = width, i; - - while (left > 0) { - stbi_uc count, value[4]; - - count = stbi__get8(s); - if (stbi__at_eof(s)) - return stbi__errpuc("bad file", "file too short (pure read count)"); - - if (count > left) - count = (stbi_uc)left; - - if (!stbi__readval(s, packet->channel, value)) - return 0; - - for (i = 0; i < count; ++i, dest += 4) - stbi__copyval(packet->channel, dest, value); - left -= count; - } - } break; - - case 2: { // Mixed RLE - int left = width; - while (left > 0) { - int count = stbi__get8(s), i; - if (stbi__at_eof(s)) - return stbi__errpuc("bad file", "file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - - if (count == 128) - count = stbi__get16be(s); - else - count -= 127; - if (count > left) - return stbi__errpuc("bad file", "scanline overrun"); - - if (!stbi__readval(s, packet->channel, value)) - return 0; - - for (i = 0; i < count; ++i, dest += 4) - stbi__copyval(packet->channel, dest, value); - } else { // Raw - ++count; - if (count > left) - return stbi__errpuc("bad file", "scanline overrun"); - - for (i = 0; i < count; ++i, dest += 4) - if (!stbi__readval(s, packet->channel, dest)) - return 0; - } - left -= count; - } - break; - } - } - } - } - - return result; -} - -static void * stbi__pic_load(stbi__context * s, int * px, int * py, int * comp, int req_comp, stbi__result_info * ri) { - stbi_uc * result; - int i, x, y, internal_comp; - STBI_NOTUSED(ri); - - if (!comp) - comp = &internal_comp; - - for (i = 0; i < 92; ++i) - stbi__get8(s); - - x = stbi__get16be(s); - y = stbi__get16be(s); - - if (y > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - if (x > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - - if (stbi__at_eof(s)) - return stbi__errpuc("bad file", "file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) - return stbi__errpuc("too large", "PIC image too large to decode"); - - stbi__get32be(s); // skip `ratio' - stbi__get16be(s); // skip `fields' - stbi__get16be(s); // skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *)stbi__malloc_mad3(x, y, 4, 0); - if (!result) - return stbi__errpuc("outofmem", "Out of memory"); - memset(result, 0xff, x * y * 4); - - if (!stbi__pic_load_core(s, x, y, comp, result)) { - STBI_FREE(result); - result = 0; - } - *px = x; - *py = y; - if (req_comp == 0) - req_comp = *comp; - result = stbi__convert_format(result, 4, req_comp, x, y); - - return result; -} - -static int stbi__pic_test(stbi__context * s) { - int r = stbi__pic_test_core(s); - stbi__rewind(s); - return r; -} -#endif - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb - -#ifndef STBI_NO_GIF -typedef struct { - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; - -typedef struct { - int w, h; - stbi_uc * out; // output buffer (always 4 components) - stbi_uc * background; // The current "background" as far as a gif is concerned - stbi_uc * history; - int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; - stbi__gif_lzw codes[8192]; - stbi_uc * color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; - int delay; -} stbi__gif; - -static int stbi__gif_test_raw(stbi__context * s) { - int sz; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return 0; - sz = stbi__get8(s); - if (sz != '9' && sz != '7') - return 0; - if (stbi__get8(s) != 'a') - return 0; - return 1; -} - -static int stbi__gif_test(stbi__context * s) { - int r = stbi__gif_test_raw(s); - stbi__rewind(s); - return r; -} - -static void stbi__gif_parse_colortable(stbi__context * s, stbi_uc pal[256][4], int num_entries, int transp) { - int i; - for (i = 0; i < num_entries; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - pal[i][3] = transp == i ? 0 : 255; - } -} - -static int stbi__gif_header(stbi__context * s, stbi__gif * g, int * comp, int is_info) { - stbi_uc version; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return stbi__err("not GIF", "Corrupt GIF"); - - version = stbi__get8(s); - if (version != '7' && version != '9') - return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') - return stbi__err("not GIF", "Corrupt GIF"); - - stbi__g_failure_reason = ""; - g->w = stbi__get16le(s); - g->h = stbi__get16le(s); - g->flags = stbi__get8(s); - g->bgindex = stbi__get8(s); - g->ratio = stbi__get8(s); - g->transparent = -1; - - if (g->w > STBI_MAX_DIMENSIONS) - return stbi__err("too large", "Very large image (corrupt?)"); - if (g->h > STBI_MAX_DIMENSIONS) - return stbi__err("too large", "Very large image (corrupt?)"); - - if (comp != 0) - *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) - return 1; - - if (g->flags & 0x80) - stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi__gif_info_raw(stbi__context * s, int * x, int * y, int * comp) { - stbi__gif * g = (stbi__gif *)stbi__malloc(sizeof(stbi__gif)); - if (!g) - return stbi__err("outofmem", "Out of memory"); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind(s); - return 0; - } - if (x) - *x = g->w; - if (y) - *y = g->h; - STBI_FREE(g); - return 1; -} - -static void stbi__out_gif_code(stbi__gif * g, stbi__uint16 code) { - stbi_uc *p, *c; - int idx; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi__out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) - return; - - idx = g->cur_x + g->cur_y; - p = &g->out[idx]; - g->history[idx / 4] = 1; - - c = &g->color_table[g->codes[code].suffix * 4]; - if (c[3] > 128) { // don't render transparent pixels; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static stbi_uc * stbi__process_gif_raster(stbi__context * s, stbi__gif * g) { - stbi_uc lzw_cs; - stbi__int32 len, init_code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw * p; - - lzw_cs = stbi__get8(s); - if (lzw_cs > 12) - return NULL; - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (init_code = 0; init_code < clear; init_code++) { - g->codes[init_code].prefix = -1; - g->codes[init_code].first = (stbi_uc)init_code; - g->codes[init_code].suffix = (stbi_uc)init_code; - } - - // support no starting clear code - avail = clear + 2; - oldcode = -1; - - len = 0; - for (;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = stbi__get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (stbi__int32)stbi__get8(s) << valid_bits; - valid_bits += 8; - } else { - stbi__int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); - while ((len = stbi__get8(s)) > 0) - stbi__skip(s, len); - return g->out; - } else if (code <= avail) { - if (first) { - return stbi__errpuc("no clear code", "Corrupt GIF"); - } - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 8192) { - return stbi__errpuc("too many codes", "Corrupt GIF"); - } - - p->prefix = (stbi__int16)oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - - stbi__out_gif_code(g, (stbi__uint16)code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -// two back is the image from two frames ago, used for a very specific disposal format -static stbi_uc * stbi__gif_load_next(stbi__context * s, stbi__gif * g, int * comp, int req_comp, stbi_uc * two_back) { - int dispose; - int first_frame; - int pi; - int pcount; - STBI_NOTUSED(req_comp); - - // on first frame, any non-written pixels get the background colour (non-transparent) - first_frame = 0; - if (g->out == 0) { - if (!stbi__gif_header(s, g, comp, 0)) - return 0; // stbi__g_failure_reason set by stbi__gif_header - if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) - return stbi__errpuc("too large", "GIF image is too large"); - pcount = g->w * g->h; - g->out = (stbi_uc *)stbi__malloc(4 * pcount); - g->background = (stbi_uc *)stbi__malloc(4 * pcount); - g->history = (stbi_uc *)stbi__malloc(pcount); - if (!g->out || !g->background || !g->history) - return stbi__errpuc("outofmem", "Out of memory"); - - // image is treated as "transparent" at the start - ie, nothing overwrites the current background; - // background colour is only used for pixels that are not rendered first frame, after that "background" - // color refers to the color that was there the previous frame. - memset(g->out, 0x00, 4 * pcount); - memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) - memset(g->history, 0x00, pcount); // pixels that were affected previous frame - first_frame = 1; - } else { - // second frame - how do we dispose of the previous one? - dispose = (g->eflags & 0x1C) >> 2; - pcount = g->w * g->h; - - if ((dispose == 3) && (two_back == 0)) { - dispose = 2; // if I don't have an image to revert back to, default to the old background - } - - if (dispose == 3) { // use previous graphic - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy(&g->out[pi * 4], &two_back[pi * 4], 4); - } - } - } else if (dispose == 2) { - // restore what was changed last frame to background before that frame; - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy(&g->out[pi * 4], &g->background[pi * 4], 4); - } - } - } else { - // This is a non-disposal case eithe way, so just - // leave the pixels as is, and they will become the new background - // 1: do not dispose - // 0: not specified. - } - - // background is what out is after the undoing of the previou frame; - memcpy(g->background, g->out, 4 * g->w * g->h); - } - - // clear my history; - memset(g->history, 0x00, g->w * g->h); // pixels that were affected previous frame - - for (;;) { - int tag = stbi__get8(s); - switch (tag) { - case 0x2C: /* Image Descriptor */ - { - stbi__int32 x, y, w, h; - stbi_uc * o; - - x = stbi__get16le(s); - y = stbi__get16le(s); - w = stbi__get16le(s); - h = stbi__get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - // if the width of the specified rectangle is 0, that means - // we may not see *any* pixels or the image is malformed; - // to make sure this is caught, move the current y down to - // max_y (which is what out_gif_code checks). - if (w == 0) - g->cur_y = g->max_y; - - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *)g->lpal; - } else if (g->flags & 0x80) { - g->color_table = (stbi_uc *)g->pal; - } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - - o = stbi__process_gif_raster(s, g); - if (!o) - return NULL; - - // if this was the first frame, - pcount = g->w * g->h; - if (first_frame && (g->bgindex > 0)) { - // if first frame, any pixel not drawn to gets the background color - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi] == 0) { - g->pal[g->bgindex][3] = - 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; - memcpy(&g->out[pi * 4], &g->pal[g->bgindex], 4); - } - } - } - - return o; - } - - case 0x21: // Comment Extension. - { - int len; - int ext = stbi__get8(s); - if (ext == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { - g->eflags = stbi__get8(s); - g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. - - // unset old transparent - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 255; - } - if (g->eflags & 0x01) { - g->transparent = stbi__get8(s); - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 0; - } - } else { - // don't need transparent - stbi__skip(s, 1); - g->transparent = -1; - } - } else { - stbi__skip(s, len); - break; - } - } - while ((len = stbi__get8(s)) != 0) { - stbi__skip(s, len); - } - break; - } - - case 0x3B: // gif stream termination code - return (stbi_uc *)s; // using '1' causes warning on some compilers - - default: - return stbi__errpuc("unknown code", "Corrupt GIF"); - } - } -} - -static void * stbi__load_gif_main_outofmem(stbi__gif * g, stbi_uc * out, int ** delays) { - STBI_FREE(g->out); - STBI_FREE(g->history); - STBI_FREE(g->background); - - if (out) - STBI_FREE(out); - if (delays && *delays) - STBI_FREE(*delays); - return stbi__errpuc("outofmem", "Out of memory"); -} - -static void * stbi__load_gif_main(stbi__context * s, int ** delays, int * x, int * y, int * z, int * comp, int req_comp) { - if (stbi__gif_test(s)) { - int layers = 0; - stbi_uc * u = 0; - stbi_uc * out = 0; - stbi_uc * two_back = 0; - stbi__gif g; - int stride; - int out_size = 0; - int delays_size = 0; - - STBI_NOTUSED(out_size); - STBI_NOTUSED(delays_size); - - memset(&g, 0, sizeof(g)); - if (delays) { - *delays = 0; - } - - do { - u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); - if (u == (stbi_uc *)s) - u = 0; // end of animated gif marker - - if (u) { - *x = g.w; - *y = g.h; - ++layers; - stride = g.w * g.h * 4; - - if (out) { - void * tmp = (stbi_uc *)STBI_REALLOC_SIZED(out, out_size, layers * stride); - if (!tmp) - return stbi__load_gif_main_outofmem(&g, out, delays); - else { - out = (stbi_uc *)tmp; - out_size = layers * stride; - } - - if (delays) { - int * new_delays = (int *)STBI_REALLOC_SIZED(*delays, delays_size, sizeof(int) * layers); - if (!new_delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - *delays = new_delays; - delays_size = layers * sizeof(int); - } - } else { - out = (stbi_uc *)stbi__malloc(layers * stride); - if (!out) - return stbi__load_gif_main_outofmem(&g, out, delays); - out_size = layers * stride; - if (delays) { - *delays = (int *)stbi__malloc(layers * sizeof(int)); - if (!*delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - delays_size = layers * sizeof(int); - } - } - memcpy(out + ((layers - 1) * stride), u, stride); - if (layers >= 2) { - two_back = out - 2 * stride; - } - - if (delays) { - (*delays)[layers - 1U] = g.delay; - } - } - } while (u != 0); - - // free temp buffer; - STBI_FREE(g.out); - STBI_FREE(g.history); - STBI_FREE(g.background); - - // do the final conversion after loading everything; - if (req_comp && req_comp != 4) - out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); - - *z = layers; - return out; - } else { - return stbi__errpuc("not GIF", "Image was not as a gif type."); - } -} - -static void * stbi__gif_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { - stbi_uc * u = 0; - stbi__gif g; - memset(&g, 0, sizeof(g)); - STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, &g, comp, req_comp, 0); - if (u == (stbi_uc *)s) - u = 0; // end of animated gif marker - if (u) { - *x = g.w; - *y = g.h; - - // moved conversion to after successful load so that the same - // can be done for multiple frames. - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g.w, g.h); - } else if (g.out) { - // if there was an error and we allocated an image buffer, free it! - STBI_FREE(g.out); - } - - // free buffers needed for multiple frame loading; - STBI_FREE(g.history); - STBI_FREE(g.background); - - return u; -} - -static int stbi__gif_info(stbi__context * s, int * x, int * y, int * comp) { return stbi__gif_info_raw(s, x, y, comp); } -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context * s, const char * signature) { - int i; - for (i = 0; signature[i]; ++i) - if (stbi__get8(s) != signature[i]) - return 0; - stbi__rewind(s); - return 1; -} - -static int stbi__hdr_test(stbi__context * s) { - int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); - stbi__rewind(s); - if (!r) { - r = stbi__hdr_test_core(s, "#?RGBE\n"); - stbi__rewind(s); - } - return r; -} - -#define STBI__HDR_BUFLEN 1024 -static char * stbi__hdr_gettoken(stbi__context * z, char * buffer) { - int len = 0; - char c = '\0'; - - c = (char)stbi__get8(z); - - while (!stbi__at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == STBI__HDR_BUFLEN - 1) { - // flush to end of line - while (!stbi__at_eof(z) && stbi__get8(z) != '\n') - ; - break; - } - c = (char)stbi__get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void stbi__hdr_convert(float * output, stbi_uc * input, int req_comp) { - if (input[3] != 0) { - float f1; - // Exponent - f1 = (float)ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) - output[1] = 1; - if (req_comp == 4) - output[3] = 1; - } else { - switch (req_comp) { - case 4: - output[3] = 1; /* fallthrough */ - case 3: - output[0] = output[1] = output[2] = 0; - break; - case 2: - output[1] = 1; /* fallthrough */ - case 1: - output[0] = 0; - break; - } - } -} - -static float * stbi__hdr_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { - char buffer[STBI__HDR_BUFLEN]; - char * token; - int valid = 0; - int width, height; - stbi_uc * scanline; - float * hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1, c2, z; - const char * headerToken; - STBI_NOTUSED(ri); - - // Check identifier - headerToken = stbi__hdr_gettoken(s, buffer); - if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) - return stbi__errpf("not HDR", "Corrupt HDR image"); - - // Parse header - for (;;) { - token = stbi__hdr_gettoken(s, buffer); - if (token[0] == 0) - break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) - valid = 1; - } - - if (!valid) - return stbi__errpf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = stbi__hdr_gettoken(s, buffer); - if (strncmp(token, "-Y ", 3)) - return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = (int)strtol(token, &token, 10); - while (*token == ' ') - ++token; - if (strncmp(token, "+X ", 3)) - return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = (int)strtol(token, NULL, 10); - - if (height > STBI_MAX_DIMENSIONS) - return stbi__errpf("too large", "Very large image (corrupt?)"); - if (width > STBI_MAX_DIMENSIONS) - return stbi__errpf("too large", "Very large image (corrupt?)"); - - *x = width; - *y = height; - - if (comp) - *comp = 3; - if (req_comp == 0) - req_comp = 3; - - if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) - return stbi__errpf("too large", "HDR image is too large"); - - // Read data - hdr_data = (float *)stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); - if (!hdr_data) - return stbi__errpf("outofmem", "Out of memory"); - - // Load image data - // image data is stored as some number of sca - if (width < 8 || width >= 32768) { - // Read flat data - for (j = 0; j < height; ++j) { - for (i = 0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - stbi__getn(s, rgbe, 4); - stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = stbi__get8(s); - c2 = stbi__get8(s); - len = stbi__get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4]; - rgbe[0] = (stbi_uc)c1; - rgbe[1] = (stbi_uc)c2; - rgbe[2] = (stbi_uc)len; - rgbe[3] = (stbi_uc)stbi__get8(s); - stbi__hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - STBI_FREE(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= stbi__get8(s); - if (len != width) { - STBI_FREE(hdr_data); - STBI_FREE(scanline); - return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); - } - if (scanline == NULL) { - scanline = (stbi_uc *)stbi__malloc_mad2(width, 4, 0); - if (!scanline) { - STBI_FREE(hdr_data); - return stbi__errpf("outofmem", "Out of memory"); - } - } - - for (k = 0; k < 4; ++k) { - int nleft; - i = 0; - while ((nleft = width - i) > 0) { - count = stbi__get8(s); - if (count > 128) { - // Run - value = stbi__get8(s); - count -= 128; - if ((count == 0) || (count > nleft)) { - STBI_FREE(hdr_data); - STBI_FREE(scanline); - return stbi__errpf("corrupt", "bad RLE data in HDR"); - } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - if ((count == 0) || (count > nleft)) { - STBI_FREE(hdr_data); - STBI_FREE(scanline); - return stbi__errpf("corrupt", "bad RLE data in HDR"); - } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = stbi__get8(s); - } - } - } - for (i = 0; i < width; ++i) - stbi__hdr_convert(hdr_data + (j * width + i) * req_comp, scanline + i * 4, req_comp); - } - if (scanline) - STBI_FREE(scanline); - } - - return hdr_data; -} - -static int stbi__hdr_info(stbi__context * s, int * x, int * y, int * comp) { - char buffer[STBI__HDR_BUFLEN]; - char * token; - int valid = 0; - int dummy; - - if (!x) - x = &dummy; - if (!y) - y = &dummy; - if (!comp) - comp = &dummy; - - if (stbi__hdr_test(s) == 0) { - stbi__rewind(s); - return 0; - } - - for (;;) { - token = stbi__hdr_gettoken(s, buffer); - if (token[0] == 0) - break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) - valid = 1; - } - - if (!valid) { - stbi__rewind(s); - return 0; - } - token = stbi__hdr_gettoken(s, buffer); - if (strncmp(token, "-Y ", 3)) { - stbi__rewind(s); - return 0; - } - token += 3; - *y = (int)strtol(token, &token, 10); - while (*token == ' ') - ++token; - if (strncmp(token, "+X ", 3)) { - stbi__rewind(s); - return 0; - } - token += 3; - *x = (int)strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -#ifndef STBI_NO_BMP -static int stbi__bmp_info(stbi__context * s, int * x, int * y, int * comp) { - void * p; - stbi__bmp_data info; - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); - if (p == NULL) { - stbi__rewind(s); - return 0; - } - if (x) - *x = s->img_x; - if (y) - *y = s->img_y; - if (comp) { - if (info.bpp == 24 && info.ma == 0xff000000) - *comp = 3; - else - *comp = info.ma ? 4 : 3; - } - return 1; -} -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_info(stbi__context * s, int * x, int * y, int * comp) { - int channelCount, dummy, depth; - if (!x) - x = &dummy; - if (!y) - y = &dummy; - if (!comp) - comp = &dummy; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind(s); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind(s); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind(s); - return 0; - } - *y = stbi__get32be(s); - *x = stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 8 && depth != 16) { - stbi__rewind(s); - return 0; - } - if (stbi__get16be(s) != 3) { - stbi__rewind(s); - return 0; - } - *comp = 4; - return 1; -} - -static int stbi__psd_is16(stbi__context * s) { - int channelCount, depth; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind(s); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind(s); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind(s); - return 0; - } - STBI_NOTUSED(stbi__get32be(s)); - STBI_NOTUSED(stbi__get32be(s)); - depth = stbi__get16be(s); - if (depth != 16) { - stbi__rewind(s); - return 0; - } - return 1; -} -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_info(stbi__context * s, int * x, int * y, int * comp) { - int act_comp = 0, num_packets = 0, chained, dummy; - stbi__pic_packet packets[10]; - - if (!x) - x = &dummy; - if (!y) - y = &dummy; - if (!comp) - comp = &dummy; - - if (!stbi__pic_is4(s, "\x53\x80\xF6\x34")) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 88); - - *x = stbi__get16be(s); - *y = stbi__get16be(s); - if (stbi__at_eof(s)) { - stbi__rewind(s); - return 0; - } - if ((*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 8); - - do { - stbi__pic_packet * packet; - - if (num_packets == sizeof(packets) / sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - act_comp |= packet->channel; - - if (stbi__at_eof(s)) { - stbi__rewind(s); - return 0; - } - if (packet->size != 8) { - stbi__rewind(s); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} -#endif - -// ************************************************************************************************* -// Portable Gray Map and Portable Pixel Map loader -// by Ken Miller -// -// PGM: http://netpbm.sourceforge.net/doc/pgm.html -// PPM: http://netpbm.sourceforge.net/doc/ppm.html -// -// Known limitations: -// Does not support comments in the header section -// Does not support ASCII image data (formats P2 and P3) - -#ifndef STBI_NO_PNM - -static int stbi__pnm_test(stbi__context * s) { - char p, t; - p = (char)stbi__get8(s); - t = (char)stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - return 1; -} - -static void * stbi__pnm_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { - stbi_uc * out; - STBI_NOTUSED(ri); - - ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); - if (ri->bits_per_channel == 0) - return 0; - - if (s->img_y > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) - return stbi__errpuc("too large", "Very large image (corrupt?)"); - - *x = s->img_x; - *y = s->img_y; - if (comp) - *comp = s->img_n; - - if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *)stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); - if (!out) - return stbi__errpuc("outofmem", "Out of memory"); - if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { - STBI_FREE(out); - return stbi__errpuc("bad PNM", "PNM file truncated"); - } - - if (req_comp && req_comp != s->img_n) { - if (ri->bits_per_channel == 16) { - out = (stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, s->img_n, req_comp, s->img_x, s->img_y); - } else { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); - } - if (out == NULL) - return out; // stbi__convert_format frees input on failure - } - return out; -} - -static int stbi__pnm_isspace(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; } - -static void stbi__pnm_skip_whitespace(stbi__context * s, char * c) { - for (;;) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char)stbi__get8(s); - - if (stbi__at_eof(s) || *c != '#') - break; - - while (!stbi__at_eof(s) && *c != '\n' && *c != '\r') - *c = (char)stbi__get8(s); - } -} - -static int stbi__pnm_isdigit(char c) { return c >= '0' && c <= '9'; } - -static int stbi__pnm_getinteger(stbi__context * s, char * c) { - int value = 0; - - while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { - value = value * 10 + (*c - '0'); - *c = (char)stbi__get8(s); - if ((value > 214748364) || (value == 214748364 && *c > '7')) - return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); - } - - return value; -} - -static int stbi__pnm_info(stbi__context * s, int * x, int * y, int * comp) { - int maxv, dummy; - char c, p, t; - - if (!x) - x = &dummy; - if (!y) - y = &dummy; - if (!comp) - comp = &dummy; - - stbi__rewind(s); - - // Get identifier - p = (char)stbi__get8(s); - t = (char)stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - - *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm - - c = (char)stbi__get8(s); - stbi__pnm_skip_whitespace(s, &c); - - *x = stbi__pnm_getinteger(s, &c); // read width - if (*x == 0) - return stbi__err("invalid width", "PPM image header had zero or overflowing width"); - stbi__pnm_skip_whitespace(s, &c); - - *y = stbi__pnm_getinteger(s, &c); // read height - if (*y == 0) - return stbi__err("invalid width", "PPM image header had zero or overflowing width"); - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value - if (maxv > 65535) - return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); - else if (maxv > 255) - return 16; - else - return 8; -} - -static int stbi__pnm_is16(stbi__context * s) { - if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) - return 1; - return 0; -} -#endif - -static int stbi__info_main(stbi__context * s, int * x, int * y, int * comp) { -#ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) - return 1; -#endif - -#ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) - return 1; -#endif - -#ifndef STBI_NO_GIF - if (stbi__gif_info(s, x, y, comp)) - return 1; -#endif - -#ifndef STBI_NO_BMP - if (stbi__bmp_info(s, x, y, comp)) - return 1; -#endif - -#ifndef STBI_NO_PSD - if (stbi__psd_info(s, x, y, comp)) - return 1; -#endif - -#ifndef STBI_NO_PIC - if (stbi__pic_info(s, x, y, comp)) - return 1; -#endif - -#ifndef STBI_NO_PNM - if (stbi__pnm_info(s, x, y, comp)) - return 1; -#endif - -#ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) - return 1; -#endif - -// test tga last because it's a crappy test! -#ifndef STBI_NO_TGA - if (stbi__tga_info(s, x, y, comp)) - return 1; -#endif - return stbi__err("unknown image type", "Image not of any known type, or corrupt"); -} - -static int stbi__is_16_main(stbi__context * s) { -#ifndef STBI_NO_PNG - if (stbi__png_is16(s)) - return 1; -#endif - -#ifndef STBI_NO_PSD - if (stbi__psd_is16(s)) - return 1; -#endif - -#ifndef STBI_NO_PNM - if (stbi__pnm_is16(s)) - return 1; -#endif - return 0; -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const * filename, int * x, int * y, int * comp) { - FILE * f = stbi__fopen(filename, "rb"); - int result; - if (!f) - return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -STBIDEF int stbi_info_from_file(FILE * f, int * x, int * y, int * comp) { - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__info_main(&s, x, y, comp); - fseek(f, pos, SEEK_SET); - return r; -} - -STBIDEF int stbi_is_16_bit(char const * filename) { - FILE * f = stbi__fopen(filename, "rb"); - int result; - if (!f) - return stbi__err("can't fopen", "Unable to open file"); - result = stbi_is_16_bit_from_file(f); - fclose(f); - return result; -} - -STBIDEF int stbi_is_16_bit_from_file(FILE * f) { - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__is_16_main(&s); - fseek(f, pos, SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_info_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp) { - stbi__context s; - stbi__start_mem(&s, buffer, len); - return stbi__info_main(&s, x, y, comp); -} - -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const * c, void * user, int * x, int * y, int * comp) { - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)c, user); - return stbi__info_main(&s, x, y, comp); -} - -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const * buffer, int len) { - stbi__context s; - stbi__start_mem(&s, buffer, len); - return stbi__is_16_main(&s); -} - -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const * c, void * user) { - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)c, user); - return stbi__is_16_main(&s); -} - -#endif // STB_IMAGE_IMPLEMENTATION - -/* - revision history: - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug - 1-bit BMP - *_is_16_bit api - avoid warnings - 2.16 (2017-07-23) all functions have 16-bit variants; - STBI_NO_STDIO works again; - compilation fixes; - fix rounding in unpremultiply; - optimize vertical flip; - disable raw_len validation; - documentation fixes - 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; - warning fixes; disable run-time SSE detection on gcc; - uniform handling of optional "return" values; - thread-safe initialization of zlib tables - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) allocate large structures on the stack - remove white matting for transparent PSD - fix reported channel count for PNG & BMP - re-enable SSE2 in non-gcc 64-bit - support RGB-formatted JPEG - read 16-bit PNGs (only as 8-bit) - 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED - 2.09 (2016-01-16) allow comments in PNM files - 16-bit-per-pixel TGA (not bit-per-component) - info() for TGA could break due to .hdr handling - info() for BMP to shares code instead of sloppy parse - can use STBI_REALLOC_SIZED if allocator doesn't support realloc - code cleanup - 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA - 2.07 (2015-09-13) fix compiler warnings - partial animated GIF support - limited 16-bpc PSD support - #ifdef unused functions - bug with < 92 byte PIC,PNM,HDR,TGA - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) extra corruption checking (mmozeiko) - stbi_set_flip_vertically_on_load (nguillemot) - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) - progressive JPEG (stb) - PGM/PPM support (Ken Miller) - STBI_MALLOC,STBI_REALLOC,STBI_FREE - GIF bugfix -- seemingly never worked - STBI_NO_*, STBI_ONLY_* - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) - optimize PNG (ryg) - fix bug in interlaced PNG with user-specified channel count (stb) - 1.46 (2014-08-26) - fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG - 1.45 (2014-08-16) - fix MSVC-ARM internal compiler error by wrapping malloc - 1.44 (2014-08-07) - various warning fixes from Ronny Chevalier - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks - anyway error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) fix inefficiency in - decoding 32-bit BMP (David Woo) 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 (2008-08-02) - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 (2006-11-19) - first released version -*/ - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/src/cpp/src/utils.hpp b/src/cpp/src/utils.hpp index fe6e4eed14..95175a17a0 100644 --- a/src/cpp/src/utils.hpp +++ b/src/cpp/src/utils.hpp @@ -79,11 +79,6 @@ ov::genai::StreamerVariant get_streamer_from_map(const ov::AnyMap& config_map); ov::genai::OptionalGenerationConfig get_config_from_map(const ov::AnyMap& config_map); -ProcessorConfig from_any_map( - const ov::AnyMap& config_map, - const ProcessorConfig& initial -); - std::pair split_core_complile_config(const ov::AnyMap& plugin_config); inline ov::genai::TokenizedInputs subtract_chat_tokenized_inputs(const ov::genai::TokenizedInputs& fisrt, const ov::genai::TokenizedInputs& second){ diff --git a/src/cpp/src/vision_encoder.cpp b/src/cpp/src/vision_encoder.cpp index 05539b67dc..8e8612697c 100644 --- a/src/cpp/src/vision_encoder.cpp +++ b/src/cpp/src/vision_encoder.cpp @@ -228,7 +228,7 @@ std::vector bucket_size_right(const std::vector& fractional_coor ov::Tensor prepare_vis_position_ids( const ov::Tensor& pixel_values, const ov::Tensor& patch_attention_mask, - const std::vector tgt_sizes, + const std::vector tgt_sizes, size_t patch_size, size_t num_patches_per_side ) { @@ -283,7 +283,7 @@ EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const o }; std::vector> imgs = ::slice_image(source, max_slice_nums, scale_resolution, patch_size, never_split); std::vector> results; - std::vector> sizes; + std::vector> sizes; // std::vector img_res_v; // format N x H x W x RGB (N x 336 x 336 x 3), so interleaved RGB - different to the python implementation which is N x 3 x 336 x 336 std::vector> preprocessed{imgs.size()}; @@ -296,7 +296,7 @@ EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const o }); const clip_image_f32& resized_preprocessed = preprocessed.at(0).at(0); - HeightWidth resized_source_size{resized_preprocessed.ny / patch_size, resized_preprocessed.nx / patch_size}; + ImageSize resized_source_size{resized_preprocessed.ny / patch_size, resized_preprocessed.nx / patch_size}; ov::Tensor input_tensor{ov::element::f32, {1, 3, size_t(resized_preprocessed.ny), size_t(resized_preprocessed.nx)}, (void*)(resized_preprocessed.buf.data())}; ov::Tensor pixel_values = preprocess_for_encoder(input_tensor, patch_size); encoder.set_tensor("pixel_values", pixel_values); @@ -314,27 +314,29 @@ EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const o return {std::move(resized_source), resized_source_size}; } - HeightWidth size{ + ImageSize raw_size{ size_t(preprocessed.at(1).at(0).ny), size_t(preprocessed.at(1).at(0).nx) }; - std::vector sliced_sizes; - size_t n_patches = size.height / patch_size * size.width / patch_size, + ImageSize slices_size{ + raw_size.height / patch_size, + raw_size.width / patch_size + }; + size_t n_patches = slices_size.height * slices_size.width, old_hidden_size = resized_source.get_shape().at(2); ov::Tensor encoded_slices{ov::element::f32, {preprocessed.size() - 1, preprocessed.at(1).size(), n_patches, old_hidden_size}}; for (size_t row = 1; row < preprocessed.size(); ++row) { for (size_t col = 0; col < preprocessed.at(row).size(); ++col) { clip_image_f32& elem = preprocessed.at(row).at(col); - sliced_sizes.push_back({elem.ny / patch_size, elem.nx / patch_size}); ov::Tensor pixel_values = preprocess_for_encoder( {ov::element::f32, {1, 3, size_t(elem.ny), size_t(elem.nx)}, elem.buf.data()}, patch_size ); encoder.set_tensor("pixel_values", pixel_values); - ov::Tensor patch_attention_mask{ov::element::boolean, {1, 1, sliced_sizes.back().height * sliced_sizes.back().width}}; + ov::Tensor patch_attention_mask{ov::element::boolean, {1, 1, slices_size.height * slices_size.width}}; std::fill_n(patch_attention_mask.data(), patch_attention_mask.get_size(), true); encoder.set_tensor("patch_attention_mask", patch_attention_mask); - ov::Tensor position_ids = prepare_vis_position_ids(pixel_values, patch_attention_mask, {sliced_sizes.back()}, ctx_clip.patch_size, ctx_clip.image_size / ctx_clip.patch_size); + ov::Tensor position_ids = prepare_vis_position_ids(pixel_values, patch_attention_mask, {slices_size}, ctx_clip.patch_size, ctx_clip.image_size / ctx_clip.patch_size); encoder.set_tensor("position_ids", position_ids); const ov::Tensor& old = encoder.get_output_tensor(); encoder.set_output_tensor({ov::element::f32, {1, n_patches, old_hidden_size}, encoded_slices.data() + ((row - 1) * preprocessed.at(row).size() + col) * n_patches * old_hidden_size}); @@ -342,7 +344,23 @@ EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const o encoder.set_output_tensor(old); } } - return {resized_source, resized_source_size, encoded_slices, sliced_sizes}; + return {resized_source, resized_source_size, encoded_slices, slices_size}; +} + +ProcessorConfig from_any_map( + const ov::AnyMap& config_map, + const ProcessorConfig& initial +) { + auto iter = config_map.find("processor_config"); + ProcessorConfig extracted_config = config_map.end() != iter ? + iter->second.as() : initial; + using utils::read_anymap_param; + read_anymap_param(config_map, "patch_size", extracted_config.patch_size); + read_anymap_param(config_map, "scale_resolution", extracted_config.scale_resolution); + read_anymap_param(config_map, "max_slice_nums", extracted_config.max_slice_nums); + read_anymap_param(config_map, "norm_mean", extracted_config.norm_mean); + read_anymap_param(config_map, "norm_std", extracted_config.norm_std); + return extracted_config; } } @@ -366,7 +384,7 @@ EncodedImage VisionEncoder::encode(const ov::Tensor& image, const ProcessorConfi } EncodedImage VisionEncoder::encode(const ov::Tensor& image, const ov::AnyMap& config_map) { - return encode(image, utils::from_any_map( + return encode(image, from_any_map( config_map, m_processor_config )); } diff --git a/src/cpp/src/vlm_pipeline.cpp b/src/cpp/src/vlm_pipeline.cpp index 99c38c976d..f77dad41ac 100644 --- a/src/cpp/src/vlm_pipeline.cpp +++ b/src/cpp/src/vlm_pipeline.cpp @@ -94,7 +94,7 @@ ov::Tensor process_prompt(ov::InferRequest& embedding, const ov::Tensor& prompt, return embed_output_tensor; } -ov::Tensor concatenate(const ov::Tensor& first, const ov::Tensor& second) { +ov::Tensor concatenate_last_dim(const ov::Tensor& first, const ov::Tensor& second) { size_t res_d_0 = first.get_shape().at(0); size_t res_d_1 = first.get_shape().at(1); OPENVINO_ASSERT(second.get_shape().at(0) == res_d_0); @@ -187,7 +187,7 @@ ov::Tensor get_1d_sincos_pos_embed_from_grid_new(size_t embed_dim, const ov::Ten std::transform(out_data, out_data + out.get_size(), emb_cos_data, [](float arg) { return std::cos(arg); }); - return concatenate(emb_sin, emb_cos); // (H, W, D) + return concatenate_last_dim(emb_sin, emb_cos); // (H, W, D) } ov::Tensor get_2d_sincos_pos_embed_from_grid(size_t embed_dim, const ov::Tensor& grid) { @@ -201,13 +201,13 @@ ov::Tensor get_2d_sincos_pos_embed_from_grid(size_t embed_dim, const ov::Tensor& end_w.at(0) = 2; ov::Tensor emb_h = get_1d_sincos_pos_embed_from_grid_new(embed_dim / 2, ov::Tensor{grid, begin_h, end_h}); // (H, W, D/2) ov::Tensor emb_w = get_1d_sincos_pos_embed_from_grid_new(embed_dim / 2, ov::Tensor{grid, begin_w, end_w}); // (H, W, D/2) - return concatenate(emb_h, emb_w); + return concatenate_last_dim(emb_h, emb_w); } /// image_size: image_size or (image_height, image_width) /// return: /// pos_embed: [image_height, image_width, embed_dim] -ov::Tensor get_2d_sincos_pos_embed(size_t embed_dim, const HeightWidth& image_size) { +ov::Tensor get_2d_sincos_pos_embed(size_t embed_dim, const ImageSize& image_size) { size_t grid_h_size = image_size.height, grid_w_size = image_size.width; ov::Tensor grid(ov::element::f32, {2, grid_h_size, grid_w_size}); float* data = grid.data(); @@ -223,14 +223,14 @@ ov::Tensor get_2d_sincos_pos_embed(size_t embed_dim, const HeightWidth& image_si } void adjust_pos_cache( - const std::vector& target_sizes, + const std::vector& target_sizes, size_t hidden_size, ov::Tensor& pos_embed_cache ) { - size_t max_h = std::max_element(target_sizes.begin(), target_sizes.end(), [](const HeightWidth& left, const HeightWidth& right) { + size_t max_h = std::max_element(target_sizes.begin(), target_sizes.end(), [](const ImageSize& left, const ImageSize& right) { return left.height < right.height; })->height; - size_t max_w = std::max_element(target_sizes.begin(), target_sizes.end(), [](const HeightWidth& left, const HeightWidth& right) { + size_t max_w = std::max_element(target_sizes.begin(), target_sizes.end(), [](const ImageSize& left, const ImageSize& right) { return left.width < right.width; })->width; size_t allocated_height, allocated_width; @@ -250,10 +250,10 @@ void adjust_pos_cache( } } -ov::Tensor resample(VLMPipeline& pipe, const ov::Tensor& encoded_image, const std::vector& target_sizes) { +ov::Tensor resample(VLMPipeline& pipe, const ov::Tensor& encoded_image, const std::vector& target_sizes) { size_t bs = encoded_image.get_shape().at(0); std::vector patch_len{target_sizes.size()}; - std::transform(target_sizes.begin(), target_sizes.end(), patch_len.begin(), [](const HeightWidth& height_width) { + std::transform(target_sizes.begin(), target_sizes.end(), patch_len.begin(), [](const ImageSize& height_width) { return height_width.height * height_width.width; }); adjust_pos_cache( @@ -301,25 +301,23 @@ class ov::genai::VLMPipeline::VLMPipelineImpl { VLMPipeline::VLMPipeline( const std::filesystem::path& model_dir, - const Tokenizer& tokenizer, const std::string& device, - const ov::AnyMap device_config, - ov::Core core + const ov::AnyMap device_config ) : m_vlm_config{ utils::from_config_json_if_exists( model_dir, "config.json" ) }, - m_tokenizer{tokenizer}, - m_vision_encoder(model_dir, device, device_config, core), - m_resampler{core.compile_model( + m_tokenizer{Tokenizer(model_dir.string(), device_config)}, + m_vision_encoder(model_dir, device, device_config, ov::Core{}), + m_resampler{ov::Core{}.compile_model( model_dir / "resampler.xml", device, device_config ).create_infer_request()}, - m_embedding{core.compile_model( + m_embedding{ov::Core{}.compile_model( model_dir / "embed_tokens.xml", device, device_config ).create_infer_request()}, - m_language{core.compile_model( + m_language{ov::Core{}.compile_model( model_dir / "language_model.xml", device, device_config ).create_infer_request()}, m_pos_embed_cache{ @@ -432,13 +430,12 @@ DecodedResults VLMPipeline::generate( if (encoded_image.slices) { size_t token_idx = 0; const ov::Shape& slices_shape = encoded_image.slices.get_shape(); - const std::vector& sliced_sizes = encoded_image.slices_sizes; for (size_t i = 0; i < slices_shape.at(0); ++i) { for (size_t ja = 0; ja < slices_shape.at(1); ++ja) { size_t d2 = slices_shape.at(2); size_t d3 = slices_shape.at(3); ov::Tensor encoded_view{ov::element::f32, {1, d2, d3}, encoded_image.slices.data() + (i * slices_shape.at(1) + ja) * d2 * d3}; - const ov::Tensor& vision_embed_tensor_i_j = resample(*this, encoded_view, {sliced_sizes.at(i * slices_shape.at(1) + ja)}); + const ov::Tensor& vision_embed_tensor_i_j = resample(*this, encoded_view, {encoded_image.slices_size}); ids = std::find(ids, end, slice_start_id); OPENVINO_ASSERT(end != ids); std::copy_n(vision_embed_tensor_i_j.data(), vision_embed_tensor_i_j.get_size(), inputs_embeds_data + std::distance(begin, ids) * m_vlm_config.hidden_size); From a5a58c2677a2d55b96d636a7ae81ec25a92fcc6d Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 7 Oct 2024 20:27:42 +0400 Subject: [PATCH 05/42] Remove error handling --- .../visual_language_chat.cpp | 4 +--- src/cpp/src/utils.cpp | 16 ---------------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/samples/cpp/visual_language_chat/visual_language_chat.cpp b/samples/cpp/visual_language_chat/visual_language_chat.cpp index a7ec36c4c5..b9af689fce 100644 --- a/samples/cpp/visual_language_chat/visual_language_chat.cpp +++ b/samples/cpp/visual_language_chat/visual_language_chat.cpp @@ -26,9 +26,7 @@ int main(int argc, char* argv[]) try { pipe.start_chat(); std::cout << "question:\n"; - if (!std::getline(std::cin, prompt)) { - throw std::runtime_error("std::cin failed"); - } + std::getline(std::cin, prompt); pipe.generate( prompt, ov::genai::image(image), diff --git a/src/cpp/src/utils.cpp b/src/cpp/src/utils.cpp index 823ac7fd6e..bab3b10382 100644 --- a/src/cpp/src/utils.cpp +++ b/src/cpp/src/utils.cpp @@ -174,22 +174,6 @@ ov::genai::OptionalGenerationConfig get_config_from_map(const ov::AnyMap& config return std::nullopt; } -ProcessorConfig from_any_map( - const ov::AnyMap& config_map, - const ProcessorConfig& initial -) { - auto iter = config_map.find("processor_config"); - ProcessorConfig extracted_config = config_map.end() != iter ? - iter->second.as() : initial; - using utils::read_anymap_param; - read_anymap_param(config_map, "patch_size", extracted_config.patch_size); - read_anymap_param(config_map, "scale_resolution", extracted_config.scale_resolution); - read_anymap_param(config_map, "max_slice_nums", extracted_config.max_slice_nums); - read_anymap_param(config_map, "norm_mean", extracted_config.norm_mean); - read_anymap_param(config_map, "norm_std", extracted_config.norm_std); - return extracted_config; -} - /** * Split config by core and compile configs * There are not supported by `core.compile` function plugin options like `ENABLE_MMAP` From 7441a1860def9dfb8012ef976b0d8526ed4975d6 Mon Sep 17 00:00:00 2001 From: Vladimir Zlobin Date: Tue, 8 Oct 2024 11:43:11 +0400 Subject: [PATCH 06/42] Allow [NHWC] and [HWC] --- .../include/openvino/genai/vlm_pipeline.hpp | 2 +- src/cpp/src/vlm_pipeline.cpp | 57 ++++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/cpp/include/openvino/genai/vlm_pipeline.hpp b/src/cpp/include/openvino/genai/vlm_pipeline.hpp index b3318fa5b1..21cd80ea23 100644 --- a/src/cpp/include/openvino/genai/vlm_pipeline.hpp +++ b/src/cpp/include/openvino/genai/vlm_pipeline.hpp @@ -72,7 +72,7 @@ class OPENVINO_GENAI_EXPORTS VLMPipeline { ~VLMPipeline(); /// @brief Generate a response given a prompt and any number of - /// uint8 RGB images with [HWC] layout. + /// uint8 RGB images with [NHWC] or [HWC] layout. /// @param prompt A prompt to respond to. /// @param images Images to be prepended to a prompt. /// @param generation_config A config to follow for text generation. diff --git a/src/cpp/src/vlm_pipeline.cpp b/src/cpp/src/vlm_pipeline.cpp index f77dad41ac..3bdc3d9ae9 100644 --- a/src/cpp/src/vlm_pipeline.cpp +++ b/src/cpp/src/vlm_pipeline.cpp @@ -338,31 +338,48 @@ DecodedResults VLMPipeline::generate( std::string images_prompt; std::vector embeds; for (const ov::Tensor& rgb : rgbs) { - EncodedImage encoded_image = m_vision_encoder.encode(rgb); - if (m_vlm_config.use_image_id) { - images_prompt += m_vlm_config.im_id_start + std::to_string(image_id) + m_vlm_config.im_id_end; - ++image_id; + ov::Tensor reshaped = rgb; + ov::Shape rgb_shape = rgb.get_shape(); + switch (rgb_shape.size()) { + case 3: + reshaped.set_shape({1, rgb_shape.at(0), rgb_shape.at(1), rgb_shape.at(2)}); + break; + case 4: break; + default: OPENVINO_THROW("Input image must have [NHWC] or [HWC] layout"); } - std::string unk64; - for (size_t idx = 0; idx < m_vlm_config.query_num; ++idx) { - unk64 += m_vlm_config.unk; - } - images_prompt += m_vlm_config.im_start + unk64 + m_vlm_config.im_end; - if (encoded_image.slices) { - ov::Shape slices_shape = encoded_image.slices.get_shape(); - for (size_t row_idx = 0; row_idx < slices_shape.at(0); ++row_idx) { - for (size_t col_idx = 0; col_idx < slices_shape.at(1); ++col_idx) { - images_prompt += m_vlm_config.slice_start + unk64 + m_vlm_config.slice_end; + ov::Shape reshaped_shape = reshaped.get_shape(); + for (size_t batch_idx = 0; batch_idx < reshaped_shape.at(0); ++batch_idx) { + ov::Tensor single_image{ + ov::element::u8, + {1, reshaped_shape.at(1), reshaped_shape.at(2), reshaped_shape.at(3)}, + reshaped.data() + batch_idx * reshaped_shape.at(1) * reshaped_shape.at(1) * reshaped_shape.at(1) + }; + EncodedImage encoded_image = m_vision_encoder.encode(single_image); + if (m_vlm_config.use_image_id) { + images_prompt += m_vlm_config.im_id_start + std::to_string(image_id) + m_vlm_config.im_id_end; + ++image_id; + } + std::string unk64; + for (size_t idx = 0; idx < m_vlm_config.query_num; ++idx) { + unk64 += m_vlm_config.unk; + } + images_prompt += m_vlm_config.im_start + unk64 + m_vlm_config.im_end; + if (encoded_image.slices) { + ov::Shape slices_shape = encoded_image.slices.get_shape(); + for (size_t row_idx = 0; row_idx < slices_shape.at(0); ++row_idx) { + for (size_t col_idx = 0; col_idx < slices_shape.at(1); ++col_idx) { + images_prompt += m_vlm_config.slice_start + unk64 + m_vlm_config.slice_end; + } + images_prompt += '\n'; } + } + if ('\n' != *(images_prompt.end() - 1)) { + // Image wasn't sliced, add \n to the end of image anyway. + // Strangely, \n isn't placed between . images_prompt += '\n'; } + embeds.push_back(std::move(encoded_image)); } - if ('\n' != *(images_prompt.end() - 1)) { - // Image wasn't sliced, add \n to the end of image anyway. - // Strangely, \n isn't placed between . - images_prompt += '\n'; - } - embeds.push_back(std::move(encoded_image)); } images_prompt += prompt; ov::Tensor encoded_input; From eaaa97169f1f1fcc8315a46de641ed556b96f5b3 Mon Sep 17 00:00:00 2001 From: Vladimir Zlobin Date: Tue, 8 Oct 2024 12:29:48 +0400 Subject: [PATCH 07/42] Move subtract_chat_tokenized_inputs' implementation to .cpp --- src/cpp/src/utils.cpp | 14 ++++++++++++++ src/cpp/src/utils.hpp | 15 +-------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/cpp/src/utils.cpp b/src/cpp/src/utils.cpp index bab3b10382..2d9a5c35e7 100644 --- a/src/cpp/src/utils.cpp +++ b/src/cpp/src/utils.cpp @@ -195,6 +195,20 @@ std::pair split_core_complile_config(const ov::AnyMap& p return {core_config, compile_config}; }; +ov::genai::TokenizedInputs subtract_chat_tokenized_inputs(const ov::genai::TokenizedInputs& minuend, const ov::genai::TokenizedInputs& subtrahend) { + auto minuend_size = minuend.input_ids.get_size(); + auto subtrahend_size = subtrahend.input_ids.get_size(); + ov::Shape new_shape{1, minuend_size - subtrahend_size}; + + ov::Tensor new_input_ids(ov::element::i64, new_shape); + auto data_ptr = minuend.input_ids.data(); + std::copy(data_ptr + subtrahend_size, data_ptr + minuend_size, new_input_ids.data()); + + ov::Tensor new_attention_mask(ov::element::i64, new_shape); + std::fill_n(new_attention_mask.data(), new_shape[1], 1); + + return {new_input_ids, new_attention_mask}; +} } // namespace utils } // namespace genai } // namespace ov diff --git a/src/cpp/src/utils.hpp b/src/cpp/src/utils.hpp index 95175a17a0..92f4ad1503 100644 --- a/src/cpp/src/utils.hpp +++ b/src/cpp/src/utils.hpp @@ -81,20 +81,7 @@ ov::genai::OptionalGenerationConfig get_config_from_map(const ov::AnyMap& config std::pair split_core_complile_config(const ov::AnyMap& plugin_config); -inline ov::genai::TokenizedInputs subtract_chat_tokenized_inputs(const ov::genai::TokenizedInputs& fisrt, const ov::genai::TokenizedInputs& second){ - auto first_size = fisrt.input_ids.get_size(); - auto second_size = second.input_ids.get_size(); - ov::Shape new_shape{1, first_size - second_size}; - - ov::Tensor new_input_ids(ov::element::i64, new_shape); - auto data_ptr = fisrt.input_ids.data(); - std::copy(data_ptr + second_size, data_ptr + first_size, new_input_ids.data()); - - ov::Tensor new_attention_mask(ov::element::i64, new_shape); - std::fill_n(new_attention_mask.data(), new_shape[1], 1); - - return {new_input_ids, new_attention_mask}; -} +ov::genai::TokenizedInputs subtract_chat_tokenized_inputs(const ov::genai::TokenizedInputs& minuend, const ov::genai::TokenizedInputs& subtrahend); } // namespace utils } // namespace genai } // namespace ov From 5eb701146b19ed15170593963878299bae1370ce Mon Sep 17 00:00:00 2001 From: Vladimir Zlobin Date: Tue, 8 Oct 2024 12:30:06 +0400 Subject: [PATCH 08/42] Revert test to drop mac --- .github/workflows/causal_lm_cpp.yml | 65 ++++++++++++++++------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index 387b3a79dd..ae604c06eb 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -681,42 +681,47 @@ jobs: diff pred2.txt ref.txt echo "Chat sample python" passed - visual_language_sample: - strategy: - fail-fast: false - # Windows fails to compile Jinja2Cpp. - matrix: {runs-on: [ubuntu-20.04-16-cores, macos-13]} - runs-on: ${{ matrix.runs-on }} + visual_chat_sample-ubuntu: + runs-on: ubuntu-22.04-16-cores + defaults: + run: + shell: bash steps: - uses: actions/checkout@v4 - with: {submodules: recursive} + with: + submodules: recursive - uses: actions/setup-python@v4 - with: {python-version: 3.12} - - run: mkdir ./ov/ - - if: ${{ 'ubuntu-20.04-16-cores' == matrix.runs-on }} - run: > - curl ${{ env.l_ov_link }} | tar --directory ./ov/ --strip-components 1 -xz - && sudo ./ov/install_dependencies/install_openvino_dependencies.sh - - if: ${{ 'macos-13' == matrix.runs-on }} - run: > - curl ${{ env.m_ov_link }} | tar --directory ./ov/ --strip-components 1 -xz - && brew install coreutils scons - - run: OpenVINO_DIR=./ov/runtime/cmake/ cmake -DCMAKE_BUILD_TYPE=Release -B ./build/ ./ - - run: > - LD_LIBRARY_PATH=${{ github.workspace }}/ov/runtime/3rdparty/tbb/lib/:$LD_LIBRARY_PATH + with: + python-version: 3.11 + - name: Install OpenVINO + run: | + mkdir ./ov/ + curl ${{ env.l_u22_ov_link }} | tar --directory ./ov/ --strip-components 1 -xz + sudo ./ov/install_dependencies/install_openvino_dependencies.sh + - name: Build app + run: | + source ./ov/setupvars.sh + cmake -DCMAKE_BUILD_TYPE=Release -S ./ -B ./build/ cmake --build ./build/ --config Release --target visual_language_chat -j - - run: > + - name: Download and convert and model + run: | source ./ov/setupvars.sh - && python -m pip install --upgrade-strategy eager ./thirdparty/openvino_tokenizers/[transformers] -r ./samples/requirements.txt --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly - - run: > + python -m pip install --upgrade-strategy eager -r ./samples/requirements.txt --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly + python -m pip install ./thirdparty/openvino_tokenizers/[transformers] --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly + python ./samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py ./miniCPM-V-2_6/ + wget https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 + + - name: Run C++ chat sample + run: | source ./ov/setupvars.sh - && python ./samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py ./miniCPM-V-2_6/ - - run: wget https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 --output-document cat.jpg - - run: > + timeout --verbose 120s ./build/samples/cpp/visual_language_chat/visual_language_chat ./miniCPM-V-2_6/ cat.jpg <<< $'What is on the image?\nWhat is special on the image?' + - name: Run Python chat sample + run: | source ./ov/setupvars.sh - && ./build/samples/cpp/visual_language_chat/visual_language_chat ./miniCPM-V-2_6/ cat.jpg - <<< $'What is on the image?\nWhat is special on the image?' - timeout-minutes: 110 + export PYTHONPATH=./build/:$PYTHONPATH + printf 'What is on the image?\nWhat is special on the image?\n' > ./input.txt + timeout 120s python ./samples/python/vlm_chat_sample/vlm_chat_sample.py ./miniCPM-V-2_6/ d5fbbd1a-d484-415c-88cb-9986625b7b11 < input.txt > ./pred.txt || ( [[ $? -eq 124 ]] && \ + echo "Timeout reached, but it's excpected." ) cpp-continuous-batching-ubuntu: runs-on: ubuntu-20.04-8-cores @@ -860,7 +865,7 @@ jobs: cpp-beam_search_causal_lm-Qwen-7B-Chat, cpp-beam_search_causal_lm-Qwen1_5-7B-Chat, cpp-beam_search_causal_lm-Phi-2, cpp-beam_search_causal_lm-notus-7b-v1, cpp-speculative_decoding_lm-ubuntu, cpp-prompt_lookup_decoding_lm-ubuntu, cpp-Phi-1_5, cpp-greedy_causal_lm-redpajama-3b-chat, cpp-chat_sample-ubuntu, cpp-continuous-batching-ubuntu, - visual_language_sample, + visual_language_sample-ubuntu, cpp-continuous-batching-windows, cpp-continuous-batching-macos] if: ${{ always() }} runs-on: ubuntu-latest From db14fd0a11d91afe7d5245fb8318cae6245df2c2 Mon Sep 17 00:00:00 2001 From: Alexander Kozlov Date: Tue, 8 Oct 2024 12:34:25 +0400 Subject: [PATCH 09/42] WWB: Add comparison for SD models (#901) Use the latest Optimum from GitHub: https://github.com/huggingface/optimum.git Some example to try: ```sh # Export FP16 model optimum-cli export openvino -m SimianLuo/LCM_Dreamshaper_v7 --weight-format fp16 sd-lcm-fp16 # Export INT8 WOQ model optimum-cli export openvino -m SimianLuo/LCM_Dreamshaper_v7 --weight-format int8 sd-lcm-int8 # Collect the references wwb --base-model sd-lcm-fp16 --gt-data lcm_test/sd_xl.json --model-type sd-lcm # Compute the metric wwb --target-model sd-lcm-int8 --gt-data lcm_test/sd_xl.json --model-type sd-lcm ``` In addition you can compare vs. SD LCM quantized in a Hybrid quantization mode as follows: ```python import time import datasets import matplotlib.pyplot as plt import numpy as np import transformers from pathlib import Path from openvino.runtime import Core from optimum.intel import OVConfig, OVQuantizer, OVStableDiffusionPipeline, OVWeightQuantizationConfig, OVLatentConsistencyModelPipeline from optimum.intel.openvino.configuration import OVQuantizationMethod transformers.logging.set_verbosity_error() datasets.logging.set_verbosity_error() MODEL_ID = "SimianLuo/LCM_Dreamshaper_v7" DATASET_NAME = "jxie/coco_captions" base_model_path = Path(f"models/{MODEL_ID}") fp32_model_path = base_model_path.with_name(base_model_path.name + "_FP32") int8_model_path = base_model_path.with_name("sd-lcm-int8") dataset = datasets.load_dataset(DATASET_NAME, split="train", streaming=True).shuffle(seed=42) print(next(iter(dataset))) def preprocess_fn(example): return {"prompt": example["caption"]} NUM_SAMPLES = 200 dataset = dataset.take(NUM_SAMPLES) calibration_dataset = dataset.map(lambda x: preprocess_fn(x), remove_columns=dataset.column_names) int8_pipe = OVLatentConsistencyModelPipeline.from_pretrained(model_id=MODEL_ID, export=True) quantization_config = OVWeightQuantizationConfig(bits=8, num_samples=NUM_SAMPLES, quant_method=OVQuantizationMethod.HYBRID) quantizer = OVQuantizer(int8_pipe) quantizer.quantize( ov_config=OVConfig(quantization_config=quantization_config), calibration_dataset=calibration_dataset, save_directory=int8_model_path ) ``` And use compute the metric the same way: ```sh wwb --target-model sd-lcm-int8 --gt-data lcm_test/sd_xl.json --model-type sd-lcm ``` --- .github/workflows/llm_bench-python.yml | 13 +- llm_bench/python/convert.py | 3 +- llm_bench/python/llm_bench_utils/ov_utils.py | 7 +- .../examples/openvino_batched_eval.py | 75 ++++-- .../tests/test_cli_image.py | 98 +++++++ .../tests/{test_cli.py => test_cli_text.py} | 174 +++++++----- .../whowhatbench/__init__.py | 15 +- .../whowhatbench/registry.py | 50 ++++ .../whowhatbench/text2image_evaluator.py | 157 +++++++++++ .../{evaluator.py => text_evaluator.py} | 91 ++++--- .../whowhatbench/whowhat_metrics.py | 51 +++- .../who_what_benchmark/whowhatbench/wwb.py | 253 ++++++++++++++---- .../python_tests/test_cache_optimizations.py | 4 +- 13 files changed, 799 insertions(+), 192 deletions(-) create mode 100644 llm_bench/python/who_what_benchmark/tests/test_cli_image.py rename llm_bench/python/who_what_benchmark/tests/{test_cli.py => test_cli_text.py} (51%) create mode 100644 llm_bench/python/who_what_benchmark/whowhatbench/registry.py create mode 100644 llm_bench/python/who_what_benchmark/whowhatbench/text2image_evaluator.py rename llm_bench/python/who_what_benchmark/whowhatbench/{evaluator.py => text_evaluator.py} (72%) diff --git a/.github/workflows/llm_bench-python.yml b/.github/workflows/llm_bench-python.yml index 45e6dc2941..be309c732d 100644 --- a/.github/workflows/llm_bench-python.yml +++ b/.github/workflows/llm_bench-python.yml @@ -40,11 +40,7 @@ jobs: python -m pip install --upgrade pip python -m pip install flake8 pytest black GIT_CLONE_PROTECTION_ACTIVE=false pip install -r ${{ env.LLM_BENCH_PYPATH }}/requirements.txt - python -m pip install -U --pre openvino openvino-tokenizers openvino-genai --extra-index-url -https://storage.openvinotoolkit.org/simple/wheels/nightly - GIT_CLONE_PROTECTION_ACTIVE=false pip install -r ${{ env.WWB_PATH }}/requirements.txt - GIT_CLONE_PROTECTION_ACTIVE=false pip install ${{ env.WWB_PATH }} - + python -m pip install -U --pre openvino openvino-tokenizers openvino-genai --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names @@ -74,6 +70,9 @@ https://storage.openvinotoolkit.org/simple/wheels/nightly python ./llm_bench/python/benchmark.py -m ./ov_models/tiny-sd/pytorch/dldt/FP16/ -pf ./llm_bench/python/prompts/stable-diffusion.jsonl -d cpu -n 1 - name: WWB Tests run: | + GIT_CLONE_PROTECTION_ACTIVE=false pip install -r ${{ env.WWB_PATH }}/requirements.txt + pip install git+https://github.com/huggingface/optimum.git + GIT_CLONE_PROTECTION_ACTIVE=false pip install ${{ env.WWB_PATH }} python -m pytest llm_bench/python/who_what_benchmark/tests stateful: runs-on: ubuntu-20.04 @@ -86,13 +85,13 @@ https://storage.openvinotoolkit.org/simple/wheels/nightly run: | GIT_CLONE_PROTECTION_ACTIVE=false python -m pip install -r llm_bench/python/requirements.txt python -m pip uninstall --yes openvino - python -m pip install -U --pre openvino openvino-tokenizers openvino-genai --extra-index-url -https://storage.openvinotoolkit.org/simple/wheels/nightly + python -m pip install -U --pre openvino openvino-tokenizers openvino-genai --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly python llm_bench/python/convert.py --model_id TinyLlama/TinyLlama-1.1B-Chat-v1.0 --output_dir . --stateful grep beam_idx pytorch/dldt/FP32/openvino_model.xml - name: WWB Tests run: | GIT_CLONE_PROTECTION_ACTIVE=false pip install -r llm_bench/python/who_what_benchmark/requirements.txt + pip install git+https://github.com/huggingface/optimum.git GIT_CLONE_PROTECTION_ACTIVE=false pip install llm_bench/python/who_what_benchmark/ pip install pytest python -m pytest llm_bench/python/who_what_benchmark/tests diff --git a/llm_bench/python/convert.py b/llm_bench/python/convert.py index 9d4d05fb99..49cea02c11 100644 --- a/llm_bench/python/convert.py +++ b/llm_bench/python/convert.py @@ -1464,7 +1464,8 @@ def main(): add_stateful_model_arguments(parser) args = parser.parse_args() - log.warning("[DEPRECATED] Not for production use! Please use the 'optimum-intel' to generate the IRs. For details, please check: https://github.com/openvinotoolkit/openvino.genai/blob/master/llm_bench/python/README.md#2-convert-model-to-openvino-ir-format") + log.warning("[DEPRECATED] Not for production use! Please use the 'optimum-intel' to generate the IRs. For details, please check:" + " https://github.com/openvinotoolkit/openvino.genai/blob/master/llm_bench/python/README.md#2-convert-model-to-openvino-ir-format") log.info(f"openvino runtime version: {get_version()}") model_type = get_convert_model_type(args.model_id.lower()) converter = converters[model_type] diff --git a/llm_bench/python/llm_bench_utils/ov_utils.py b/llm_bench/python/llm_bench_utils/ov_utils.py index b9434c5f3d..1d66389086 100644 --- a/llm_bench/python/llm_bench_utils/ov_utils.py +++ b/llm_bench/python/llm_bench_utils/ov_utils.py @@ -193,7 +193,7 @@ def create_genai_text_gen_model(model_path, device, ov_config, **kwargs): scheduler_params = kwargs.get("cb_config") or {"cache_size": 1} if scheduler_params: log.info(f"Scheduler parameters:\n{scheduler_params}") - + for param, value in scheduler_params.items(): setattr(scheduler_config, param, value) ov_config["scheduler_config"] = scheduler_config @@ -209,19 +209,24 @@ def __init__(self, tokenizer): self.token_generation_time = [] self.generated_tokens = [] self.start_time = time.perf_counter() + def put(self, token_id): self.token_generation_time.append(time.perf_counter() - self.start_time) self.generated_tokens.append(token_id) self.start_time = time.perf_counter() return False + def reset(self): self.token_generation_time = [] self.generated_tokens = [] self.start_time = time.perf_counter() + def end(self): pass + def get_tokens(self): return self.generated_tokens + def get_time_list(self): return self.token_generation_time streamer = TokenStreamer(llm_pipe.get_tokenizer()) if cb else None diff --git a/llm_bench/python/who_what_benchmark/examples/openvino_batched_eval.py b/llm_bench/python/who_what_benchmark/examples/openvino_batched_eval.py index 12fc726f38..5781ddf229 100644 --- a/llm_bench/python/who_what_benchmark/examples/openvino_batched_eval.py +++ b/llm_bench/python/who_what_benchmark/examples/openvino_batched_eval.py @@ -6,7 +6,13 @@ from whowhatbench.wwb import load_dataset from optimum.intel.openvino import OVModelForCausalLM -from openvino_genai import ContinuousBatchingPipeline, SchedulerConfig, GenerationConfig, CacheEvictionConfig, AggregationMode +from openvino_genai import ( + ContinuousBatchingPipeline, + SchedulerConfig, + GenerationConfig, + CacheEvictionConfig, + AggregationMode, +) from openvino_tokenizers import convert_tokenizer from openvino import serialize @@ -18,12 +24,16 @@ MAX_SEQUENCES = 100 -model = OVModelForCausalLM.from_pretrained(model_id, export=True, trust_remote_code=True) +model = OVModelForCausalLM.from_pretrained( + model_id, export=True, trust_remote_code=True +) tokenizer = AutoTokenizer.from_pretrained(model_id) model_path = PosixPath(tempfile.gettempdir()) / model_id model.save_pretrained(model_path) -ov_tokenizer, ov_detokenizer = convert_tokenizer(tokenizer, with_detokenizer=True, skip_special_tokens=True) +ov_tokenizer, ov_detokenizer = convert_tokenizer( + tokenizer, with_detokenizer=True, skip_special_tokens=True +) serialize(ov_tokenizer, model_path / "openvino_tokenizer.xml") serialize(ov_detokenizer, model_path / "openvino_detokenizer.xml") @@ -48,24 +58,39 @@ generation_config.num_return_sequences = 1 generation_config.max_new_tokens = MAX_NEW_TOKENS -data = load_dataset(path='squad', name=None, split='validation')["context"] -data_dict = {"questions": list(dict({k: None for k in data}).keys())[:MAX_SEQUENCES]} +data = load_dataset(path="squad", name=None, split="validation")["context"] +data_dict = {"prompts": list(dict({k: None for k in data}).keys())[:MAX_SEQUENCES]} -model_cb_noopt = ContinuousBatchingPipeline(model_path.absolute().as_posix(), scheduler_config_noopt, "CPU", {}) -model_cb_opt = ContinuousBatchingPipeline(model_path.absolute().as_posix(), scheduler_config_opt, "CPU", {}) +model_cb_noopt = ContinuousBatchingPipeline( + model_path.absolute().as_posix(), scheduler_config_noopt, "CPU", {} +) +model_cb_opt = ContinuousBatchingPipeline( + model_path.absolute().as_posix(), scheduler_config_opt, "CPU", {} +) -GT_DATA_FILE = 'gt_data.csv' +GT_DATA_FILE = "gt_data.csv" if os.path.exists(GT_DATA_FILE): - evaluator = whowhatbench.Evaluator(base_model=model_cb_noopt, gt_data=GT_DATA_FILE, tokenizer=tokenizer, - test_data=data_dict, generation_config=generation_config, - max_new_tokens=MAX_NEW_TOKENS, seqs_per_request=3) + evaluator = whowhatbench.TextEvaluator( + base_model=model_cb_noopt, + gt_data=GT_DATA_FILE, + tokenizer=tokenizer, + test_data=data_dict, + generation_config=generation_config, + max_new_tokens=MAX_NEW_TOKENS, + seqs_per_request=3, + ) else: - evaluator = whowhatbench.Evaluator(base_model=model_cb_noopt, tokenizer=tokenizer, test_data=data_dict, - generation_config=generation_config, max_new_tokens=MAX_NEW_TOKENS, - seqs_per_request=3) - evaluator.dump_gt('gt_data.csv') + evaluator = whowhatbench.TextEvaluator( + base_model=model_cb_noopt, + tokenizer=tokenizer, + test_data=data_dict, + generation_config=generation_config, + max_new_tokens=MAX_NEW_TOKENS, + seqs_per_request=3, + ) + evaluator.dump_gt("gt_data.csv") all_metrics_per_question, all_metrics = evaluator.score(model_cb_opt) @@ -89,8 +114,18 @@ pipeline_opt_metrics = model_cb_opt.get_metrics() pipeline_noopt_metrics = model_cb_noopt.get_metrics() -print(f"No-opt cache usage: max {pipeline_noopt_metrics.max_cache_usage:.3f}, avg {pipeline_noopt_metrics.avg_cache_usage:.3f}") -print(f"Opt cache usage: max {pipeline_opt_metrics.max_cache_usage:.3f}, avg {pipeline_opt_metrics.avg_cache_usage:.3f}") -max_optimization_ratio = (pipeline_noopt_metrics.max_cache_usage / pipeline_opt_metrics.max_cache_usage) -avg_optimization_ratio = (pipeline_noopt_metrics.avg_cache_usage / pipeline_opt_metrics.avg_cache_usage) -print(f"Optimization ratios: max {max_optimization_ratio:.3f}x, avg {avg_optimization_ratio:.3f}x") +print( + f"No-opt cache usage: max {pipeline_noopt_metrics.max_cache_usage:.3f}, avg {pipeline_noopt_metrics.avg_cache_usage:.3f}" +) +print( + f"Opt cache usage: max {pipeline_opt_metrics.max_cache_usage:.3f}, avg {pipeline_opt_metrics.avg_cache_usage:.3f}" +) +max_optimization_ratio = ( + pipeline_noopt_metrics.max_cache_usage / pipeline_opt_metrics.max_cache_usage +) +avg_optimization_ratio = ( + pipeline_noopt_metrics.avg_cache_usage / pipeline_opt_metrics.avg_cache_usage +) +print( + f"Optimization ratios: max {max_optimization_ratio:.3f}x, avg {avg_optimization_ratio:.3f}x" +) diff --git a/llm_bench/python/who_what_benchmark/tests/test_cli_image.py b/llm_bench/python/who_what_benchmark/tests/test_cli_image.py new file mode 100644 index 0000000000..f4c10eac86 --- /dev/null +++ b/llm_bench/python/who_what_benchmark/tests/test_cli_image.py @@ -0,0 +1,98 @@ +import subprocess # nosec B404 +import os +import shutil +import pytest +import logging + + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def run_wwb(args): + logger.info(" ".join(["wwb"] + args)) + result = subprocess.run(["wwb"] + args, capture_output=True, text=True) + logger.info(result) + return result + + +@pytest.mark.parametrize( + ("model_id", "model_type", "backend"), + [ + ("hf-internal-testing/tiny-stable-diffusion-torch", "sd", "hf"), + ("hf-internal-testing/tiny-stable-diffusion-torch", "sd", "openvino"), + ("hf-internal-testing/tiny-stable-diffusion-xl-pipe", "sd-xl", "hf"), + ], +) +def test_image_model_types(model_id, model_type, backend): + GT_FILE = "test_sd.json" + wwb_args = [ + "--base-model", + model_id, + "--target-model", + model_id, + "--num-samples", + "1", + "--gt-data", + GT_FILE, + "--device", + "CPU", + "--model-type", + model_type, + ] + if backend == "hf": + wwb_args.append("--hf") + + result = run_wwb(wwb_args) + print(f"WWB result: {result}, {result.stderr}") + + try: + os.remove(GT_FILE) + except OSError: + pass + shutil.rmtree("reference", ignore_errors=True) + shutil.rmtree("target", ignore_errors=True) + + assert result.returncode == 0 + assert "Metrics for model" in result.stderr + assert "## Reference text" not in result.stderr + + +@pytest.mark.parametrize( + ("model_id", "model_type", "backend"), + [ + ("hf-internal-testing/tiny-stable-diffusion-torch", "sd", "hf"), + ], +) +def test_image_custom_dataset(model_id, model_type, backend): + GT_FILE = "test_sd.json" + wwb_args = [ + "--base-model", + model_id, + "--num-samples", + "1", + "--gt-data", + GT_FILE, + "--device", + "CPU", + "--model-type", + model_type, + "--dataset", + "google-research-datasets/conceptual_captions", + "--dataset-field", + "caption", + ] + if backend == "hf": + wwb_args.append("--hf") + + result = run_wwb(wwb_args) + + assert os.path.exists(GT_FILE) + + try: + os.remove(GT_FILE) + except OSError: + pass + shutil.rmtree("reference", ignore_errors=True) + + assert result.returncode == 0 diff --git a/llm_bench/python/who_what_benchmark/tests/test_cli.py b/llm_bench/python/who_what_benchmark/tests/test_cli_text.py similarity index 51% rename from llm_bench/python/who_what_benchmark/tests/test_cli.py rename to llm_bench/python/who_what_benchmark/tests/test_cli_text.py index 8110e98335..161a9afb72 100644 --- a/llm_bench/python/who_what_benchmark/tests/test_cli.py +++ b/llm_bench/python/who_what_benchmark/tests/test_cli_text.py @@ -16,11 +16,7 @@ def run_wwb(args): logger.info(" ".join(["wwb"] + args)) - result = subprocess.run( - ["wwb"] + args, - capture_output=True, - text=True - ) + result = subprocess.run(["wwb"] + args, capture_output=True, text=True) logger.info(result) return result @@ -54,13 +50,21 @@ def teardown_module(): shutil.rmtree(tmp_dir) -def test_target_model(): - result = run_wwb([ - "--base-model", base_model_path, - "--target-model", target_model_path, - "--num-samples", "2", - "--device", "CPU" - ]) +def test_text_target_model(): + result = run_wwb( + [ + "--base-model", + base_model_path, + "--target-model", + target_model_path, + "--num-samples", + "2", + "--device", + "CPU", + "--model-type", + "text", + ] + ) assert result.returncode == 0 assert "Metrics for model" in result.stderr @@ -68,19 +72,28 @@ def test_target_model(): @pytest.fixture -def test_gt_data(): +def test_text_gt_data(): with tempfile.NamedTemporaryFile(suffix=".csv") as tmpfile: temp_file_name = tmpfile.name - result = run_wwb([ - "--base-model", base_model_path, - "--gt-data", temp_file_name, - "--dataset", "EleutherAI/lambada_openai,en", - "--dataset-field", "text", - "--split", "test", - "--num-samples", "2", - "--device", "CPU" - ]) + result = run_wwb( + [ + "--base-model", + base_model_path, + "--gt-data", + temp_file_name, + "--dataset", + "EleutherAI/lambada_openai,en", + "--dataset-field", + "text", + "--split", + "test", + "--num-samples", + "2", + "--device", + "CPU", + ] + ) data = pd.read_csv(temp_file_name) os.remove(temp_file_name) @@ -88,76 +101,107 @@ def test_gt_data(): assert len(data["questions"].values) == 2 -def test_output_directory(): +def test_text_output_directory(): with tempfile.TemporaryDirectory() as temp_dir: - result = run_wwb([ - "--base-model", base_model_path, - "--target-model", target_model_path, - "--num-samples", "2", - "--device", "CPU", - "--output", temp_dir - ]) + result = run_wwb( + [ + "--base-model", + base_model_path, + "--target-model", + target_model_path, + "--num-samples", + "2", + "--device", + "CPU", + "--output", + temp_dir, + ] + ) assert result.returncode == 0 assert "Metrics for model" in result.stderr assert os.path.exists(os.path.join(temp_dir, "metrics_per_qustion.csv")) assert os.path.exists(os.path.join(temp_dir, "metrics.csv")) -def test_verbose(): - result = run_wwb([ - "--base-model", base_model_path, - "--target-model", target_model_path, - "--num-samples", "2", - "--device", "CPU", - "--verbose" - ]) +def test_text_verbose(): + result = run_wwb( + [ + "--base-model", + base_model_path, + "--target-model", + target_model_path, + "--num-samples", + "2", + "--device", + "CPU", + "--verbose", + ] + ) assert result.returncode == 0 assert "## Diff " in result.stderr -def test_language_autodetect(): +def test_text_language_autodetect(): with tempfile.NamedTemporaryFile(suffix=".csv") as tmpfile: temp_file_name = tmpfile.name - result = run_wwb([ - "--base-model", "Qwen/Qwen2-0.5B", - "--gt-data", temp_file_name, - "--num-samples", "2", - "--device", "CPU" - ]) + result = run_wwb( + [ + "--base-model", + "Qwen/Qwen2-0.5B", + "--gt-data", + temp_file_name, + "--num-samples", + "2", + "--device", + "CPU", + ] + ) data = pd.read_csv(temp_file_name) os.remove(temp_file_name) assert result.returncode == 0 - assert "马克" in data["questions"].values[0] + assert "马克" in data["prompts"].values[0] -def test_hf_model(): +def test_text_hf_model(): with tempfile.NamedTemporaryFile(suffix=".csv") as tmpfile: temp_file_name = tmpfile.name - result = run_wwb([ - "--base-model", model_id, - "--gt-data", temp_file_name, - "--num-samples", "2", - "--device", "CPU", - "--hf" - ]) + result = run_wwb( + [ + "--base-model", + model_id, + "--gt-data", + temp_file_name, + "--num-samples", + "2", + "--device", + "CPU", + "--hf", + ] + ) data = pd.read_csv(temp_file_name) os.remove(temp_file_name) assert result.returncode == 0 - assert len(data["questions"].values) == 2 - - -def test_genai_model(): - result = run_wwb([ - "--base-model", base_model_path, - "--target-model", target_model_path, - "--num-samples", "2", - "--device", "CPU", - "--genai" - ]) + assert len(data["prompts"].values) == 2 + + +def test_text_genai_model(): + result = run_wwb( + [ + "--base-model", + base_model_path, + "--target-model", + target_model_path, + "--num-samples", + "2", + "--device", + "CPU", + "--genai", + ] + ) assert result.returncode == 0 assert "Metrics for model" in result.stderr assert "## Reference text" not in result.stderr diff --git a/llm_bench/python/who_what_benchmark/whowhatbench/__init__.py b/llm_bench/python/who_what_benchmark/whowhatbench/__init__.py index 86f428ddd7..4d61b0d086 100644 --- a/llm_bench/python/who_what_benchmark/whowhatbench/__init__.py +++ b/llm_bench/python/who_what_benchmark/whowhatbench/__init__.py @@ -1,4 +1,13 @@ -"""Who what benchmark APIs.""" -from .evaluator import Evaluator +from .registry import register_evaluator, MODELTYPE2TASK, EVALUATOR_REGISTRY +from .text_evaluator import TextEvaluator +from .text_evaluator import TextEvaluator as Evaluator +from .text2image_evaluator import Text2ImageEvaluator -__all__ = ["Evaluator"] +__all__ = [ + "Evaluator", + "register_evaluator", + "TextEvaluator", + "Text2ImageEvaluator", + "MODELTYPE2TASK", + "EVALUATOR_REGISTRY", +] diff --git a/llm_bench/python/who_what_benchmark/whowhatbench/registry.py b/llm_bench/python/who_what_benchmark/whowhatbench/registry.py new file mode 100644 index 0000000000..208ba60ff3 --- /dev/null +++ b/llm_bench/python/who_what_benchmark/whowhatbench/registry.py @@ -0,0 +1,50 @@ +from abc import ABC, abstractmethod + +from optimum.intel import ( + OVLatentConsistencyModelPipeline, + OVStableDiffusionPipeline, + OVStableDiffusionXLPipeline, +) + + +# Registry for evaluators +EVALUATOR_REGISTRY = {} +MODELTYPE2TASK = { + "text": "text-generation", + "sd": "image-generation", + "sd-xl": "image-generation", + "sd-lcm": "image-generation", +} + +TEXT2IMAGE_TASK2CLASS = { + "sd": OVStableDiffusionPipeline, + "sd-xl": OVStableDiffusionXLPipeline, + "sd-lcm": OVLatentConsistencyModelPipeline, +} + + +def register_evaluator(*names): + def decorate(cls): + for name in names: + assert ( + name not in EVALUATOR_REGISTRY + ), f"Evaluator named '{name}' conflicts with existing evaluators! Please register with a non-conflicting alias instead." + + EVALUATOR_REGISTRY[name] = cls + return cls + + return decorate + + +class BaseEvaluator(ABC): + @abstractmethod + def dump_gt(self, csv_name: str): + pass + + @abstractmethod + def score(self, model, **kwargs): + pass + + @abstractmethod + def worst_examples(self, top_k: int = 5, metric="similarity"): + pass diff --git a/llm_bench/python/who_what_benchmark/whowhatbench/text2image_evaluator.py b/llm_bench/python/who_what_benchmark/whowhatbench/text2image_evaluator.py new file mode 100644 index 0000000000..b8b8234547 --- /dev/null +++ b/llm_bench/python/who_what_benchmark/whowhatbench/text2image_evaluator.py @@ -0,0 +1,157 @@ +import os +from typing import Any, Union + +import pandas as pd +from tqdm import tqdm +from transformers import set_seed +import torch + +from .registry import register_evaluator, BaseEvaluator + +from .whowhat_metrics import ImageSimilarity + +default_data = { + "prompts": [ + "Cinematic, a vibrant Mid-century modern dining area, colorful chairs and a sideboard, ultra realistic, many detail", + "colibri flying near a flower, side view, forest background, natural light, photorealistic, 4k", + "Illustration of an astronaut sitting in outer space, moon behind him", + "A vintage illustration of a retro computer, vaporwave aesthetic, light pink and light blue", + "A view from beautiful alien planet, very beautiful, surealism, retro astronaut on the first plane, 8k photo", + ], +} + + +@register_evaluator("image-generation") +class Text2ImageEvaluator(BaseEvaluator): + def __init__( + self, + base_model: Any = None, + gt_data: str = None, + test_data: Union[str, list] = None, + metrics="similarity", + similarity_model_id: str = "openai/clip-vit-large-patch14", + resolution=(512, 512), + num_inference_steps=4, + crop_prompts=True, + num_samples=None, + gen_image_fn=None, + seed=42, + ) -> None: + assert ( + base_model is not None or gt_data is not None + ), "Text generation pipeline for evaluation or ground trush data must be defined" + + self.test_data = test_data + self.metrics = metrics + self.resolution = resolution + self.crop_prompt = crop_prompts + self.num_samples = num_samples + self.num_inference_steps = num_inference_steps + self.seed = seed + self.similarity = None + self.similarity = ImageSimilarity(similarity_model_id) + self.last_cmp = None + self.gt_dir = os.path.dirname(gt_data) + if base_model: + self.gt_data = self._generate_data( + base_model, gen_image_fn, os.path.join(self.gt_dir, "reference") + ) + else: + self.gt_data = pd.read_csv(gt_data, keep_default_na=False) + + def dump_gt(self, csv_name: str): + self.gt_data.to_csv(csv_name) + + def score(self, model, gen_image_fn=None): + predictions = self._generate_data( + model, gen_image_fn, os.path.join(self.gt_dir, "target") + ) + + all_metrics_per_prompt = {} + all_metrics = {} + + if self.similarity: + metric_dict, metric_per_question = self.similarity.evaluate( + self.gt_data, predictions + ) + all_metrics.update(metric_dict) + all_metrics_per_prompt.update(metric_per_question) + + self.last_cmp = all_metrics_per_prompt + self.last_cmp["prompts"] = predictions["prompts"].values + self.last_cmp["source_model"] = self.gt_data["images"].values + self.last_cmp["optimized_model"] = predictions["images"].values + self.last_cmp = pd.DataFrame(self.last_cmp) + + return pd.DataFrame(all_metrics_per_prompt), pd.DataFrame([all_metrics]) + + def worst_examples(self, top_k: int = 5, metric="similarity"): + assert self.last_cmp is not None + + res = self.last_cmp.nsmallest(top_k, metric) + res = list(row for idx, row in res.iterrows()) + + return res + + def _generate_data(self, model, gen_image_fn=None, image_dir="reference"): + if hasattr(model, "reshape") and self.resolution is not None: + model.reshape( + batch_size=1, + height=self.resolution[0], + width=self.resolution[1], + num_images_per_prompt=1, + ) + + def default_gen_image_fn(model, prompt, num_inference_steps, generator=None): + output = model( + prompt, + num_inference_steps=num_inference_steps, + output_type="pil", + width=self.resolution[0], + height=self.resolution[0], + generator=generator, + ) + return output.images[0] + + gen_image_fn = gen_image_fn or default_gen_image_fn + + if self.test_data: + if isinstance(self.test_data, str): + data = pd.read_csv(self.test_data) + else: + if isinstance(self.test_data, dict): + assert "prompts" in self.test_data + data = dict(self.test_data) + else: + data = {"prompts": list(self.test_data)} + data = pd.DataFrame.from_dict(data) + else: + data = pd.DataFrame.from_dict(default_data) + + prompts = data["prompts"] + prompts = ( + prompts.values + if self.num_samples is None + else prompts.values[: self.num_samples] + ) + images = [] + rng = torch.Generator(device="cpu") + + if not os.path.exists(image_dir): + os.makedirs(image_dir) + for i, prompt in tqdm(enumerate(prompts), desc="Evaluate pipeline"): + set_seed(self.seed) + image = gen_image_fn( + model, + prompt, + self.num_inference_steps, + generator=rng.manual_seed(self.seed), + ) + image_path = os.path.join(image_dir, f"{i}.png") + image.save(image_path) + images.append(image_path) + + res_data = {"prompts": list(prompts), "images": images} + df = pd.DataFrame(res_data) + + return df diff --git a/llm_bench/python/who_what_benchmark/whowhatbench/evaluator.py b/llm_bench/python/who_what_benchmark/whowhatbench/text_evaluator.py similarity index 72% rename from llm_bench/python/who_what_benchmark/whowhatbench/evaluator.py rename to llm_bench/python/who_what_benchmark/whowhatbench/text_evaluator.py index bb0d17e34e..a6453cb66f 100644 --- a/llm_bench/python/who_what_benchmark/whowhatbench/evaluator.py +++ b/llm_bench/python/who_what_benchmark/whowhatbench/text_evaluator.py @@ -3,11 +3,12 @@ import pandas as pd from tqdm import tqdm -from .whowhat_metrics import DivergencyMetric, SimilarityMetric +from .registry import register_evaluator, BaseEvaluator +from .whowhat_metrics import TextDivergency, TextSimilarity default_data = { - "en" : { - "questions": [ + "en": { + "prompts": [ "Who is Mark Twain?", "Who is William Shakespeare?", "Who is Agatha Christie?", @@ -38,12 +39,12 @@ ], }, "cn": { - "questions": [ + "prompts": [ "马克吐温是谁?", "谁是威廉-莎士比亚?", "阿加莎-克里斯蒂是谁?", "芭芭拉-卡特兰是谁?", - "丹妮尔-斯蒂尔是谁?" + "丹妮尔-斯蒂尔是谁?", "谁是哈罗德-罗宾斯?", "乔治-西默农是谁?", "伊妮德-布莱顿是谁?", @@ -86,7 +87,10 @@ def autodetect_language(model): return model2language.get(model.config.model_type, "en") -class Evaluator: +@register_evaluator( + "text-generation", "text-generation-with-past", "text2text-generation" +) +class TextEvaluator(BaseEvaluator): def __init__( self, base_model: Any = None, @@ -102,7 +106,7 @@ def __init__( gen_answer_fn=None, generation_config=None, generation_config_base=None, - seqs_per_request=None + seqs_per_request=None, ) -> None: assert ( base_model is not None or gt_data is not None @@ -127,7 +131,9 @@ def __init__( self.language = autodetect_language(base_model) if base_model: - self.gt_data = self._generate_data(base_model, gen_answer_fn, generation_config=generation_config) + self.gt_data = self._generate_data( + base_model, gen_answer_fn, generation_config=generation_config + ) else: self.gt_data = pd.read_csv(gt_data, keep_default_na=False) @@ -138,10 +144,10 @@ def __init__( self.similarity = None self.divergency = None if "similarity" in self.metrics: - self.similarity = SimilarityMetric(similarity_model_id) + self.similarity = TextSimilarity(similarity_model_id) if "divergency" in self.metrics: assert tokenizer is not None - self.divergency = DivergencyMetric(tokenizer) + self.divergency = TextDivergency(tokenizer) self.last_cmp = None @@ -151,7 +157,7 @@ def dump_gt(self, csv_name: str): def score(self, model, gen_answer_fn=None): predictions = self._generate_data(model, gen_answer_fn, self.generation_config) - all_metrics_per_question = {} + all_metrics_per_prompt = {} all_metrics = {} if self.similarity: @@ -159,23 +165,23 @@ def score(self, model, gen_answer_fn=None): self.gt_data, predictions ) all_metrics.update(metric_dict) - all_metrics_per_question.update(metric_per_question) + all_metrics_per_prompt.update(metric_per_question) if self.divergency: metric_dict, metric_per_question = self.divergency.evaluate( self.gt_data, predictions ) all_metrics.update(metric_dict) - all_metrics_per_question.update(metric_per_question) + all_metrics_per_prompt.update(metric_per_question) - self.last_cmp = all_metrics_per_question - self.last_cmp["questions"] = predictions["questions"].values + self.last_cmp = all_metrics_per_prompt + self.last_cmp["prompts"] = predictions["prompts"].values self.last_cmp["source_model"] = self.gt_data["answers"].values self.last_cmp["optimized_model"] = predictions["answers"].values self.last_cmp = pd.DataFrame(self.last_cmp) - self.last_cmp.rename(columns={"questions": "prompt"}, inplace=True) + self.last_cmp.rename(columns={"prompts": "prompt"}, inplace=True) - return pd.DataFrame(all_metrics_per_question), pd.DataFrame([all_metrics]) + return pd.DataFrame(all_metrics_per_prompt), pd.DataFrame([all_metrics]) def worst_examples(self, top_k: int = 5, metric="similarity"): assert self.last_cmp is not None @@ -190,12 +196,12 @@ def worst_examples(self, top_k: int = 5, metric="similarity"): return res def _generate_data(self, model, gen_answer_fn=None, generation_config=None): - def default_gen_answer(model, tokenizer, question, max_new_tokens, crop_question): - inputs = self.tokenizer(question, return_tensors="pt") + def default_gen_answer(model, tokenizer, prompt, max_new_tokens, crop_question): + inputs = self.tokenizer(prompt, return_tensors="pt") tokens = model.generate(**inputs, max_new_tokens=max_new_tokens) out = self.tokenizer.batch_decode(tokens, skip_special_tokens=True)[0] - return out[len(question) :] if crop_question else out + return out[len(prompt) :] if crop_question else out gen_answer_fn = gen_answer_fn or default_gen_answer @@ -204,39 +210,58 @@ def default_gen_answer(model, tokenizer, question, max_new_tokens, crop_question data = pd.read_csv(self.test_data) else: if isinstance(self.test_data, dict): - assert "questions" in self.test_data + assert "prompts" in self.test_data data = dict(self.test_data) else: - data = {"questions": list(self.test_data)} + data = {"prompts": list(self.test_data)} data = pd.DataFrame.from_dict(data) else: if self.language is None: - print("No language detecting in the base model or ground truth data. Taking language from target model.") + print( + "No language detecting in the base model or ground truth data. Taking language from target model." + ) self.language = autodetect_language(model) data = pd.DataFrame.from_dict(default_data[self.language]) - questions = data["questions"] + prompt_data = data["prompts"] answers = [] - prompts = questions.values if self.num_samples is None else questions.values[:self.num_samples] + prompts = ( + prompt_data.values + if self.num_samples is None + else prompt_data.values[: self.num_samples] + ) if generation_config is None: - for q in tqdm(prompts, desc="Evaluate pipeline"): - answers.append(gen_answer_fn(model, self.tokenizer, q, self.max_new_tokens, self._crop_question)) + for p in tqdm(prompts, desc="Evaluate pipeline"): + answers.append( + gen_answer_fn( + model, + self.tokenizer, + p, + self.max_new_tokens, + self._crop_question, + ) + ) else: - with tqdm(total=len(questions.values)) as progress_bar: + with tqdm(total=len(prompt_data.values)) as progress_bar: batch = [] - for q_idx, q in enumerate(questions.values): + for p_idx, p in enumerate(prompt_data.values): progress_bar.update(1) - batch.append(q) - if len(batch) == self.seqs_per_request or q_idx == len(questions.values) - 1: - ans_batch = model.generate(batch, [generation_config] * len(batch)) + batch.append(p) + if ( + len(batch) == self.seqs_per_request + or p_idx == len(prompt_data.values) - 1 + ): + ans_batch = model.generate( + batch, [generation_config] * len(batch) + ) for ans in ans_batch: answers.append(ans.m_generation_ids[0]) batch.clear() - res_data = {"questions": list(prompts), "answers": answers} + res_data = {"prompts": list(prompts), "answers": answers} df = pd.DataFrame(res_data) df["language"] = self.language diff --git a/llm_bench/python/who_what_benchmark/whowhatbench/whowhat_metrics.py b/llm_bench/python/who_what_benchmark/whowhatbench/whowhat_metrics.py index 83157e05ca..bbf96a3312 100644 --- a/llm_bench/python/who_what_benchmark/whowhatbench/whowhat_metrics.py +++ b/llm_bench/python/who_what_benchmark/whowhatbench/whowhat_metrics.py @@ -1,10 +1,15 @@ """ Metrics for text similarity """ + from difflib import SequenceMatcher +from PIL import Image +import torch +import torch.nn.functional as F import numpy as np from sentence_transformers import SentenceTransformer, util +from transformers import CLIPImageProcessor, CLIPModel from tqdm import tqdm @@ -68,9 +73,7 @@ def evaluate_divergency(tokenizer, data_gold, data_prediction): fdt_list.append(fdt) num_matched = sum(block.size for block in blocks) - sdt = ( - len(b_indexes) - num_matched - ) + sdt = len(b_indexes) - num_matched sdt_list.append(sdt) sdt_norm = sdt / len(b_indexes) sdtn_list.append(sdt_norm) @@ -104,7 +107,7 @@ def evaluate_divergency(tokenizer, data_gold, data_prediction): return metric_dict, metric_per_question -class SimilarityMetric: +class TextSimilarity: def __init__(self, model_id) -> None: self.model = SentenceTransformer(model_id) @@ -112,9 +115,47 @@ def evaluate(self, gt, prediction): return evaluate_similarity(self.model, gt, prediction) -class DivergencyMetric: +class TextDivergency: def __init__(self, tokenizer) -> None: self.tokenizer = tokenizer def evaluate(self, gt, prediction): return evaluate_divergency(self.tokenizer, gt, prediction) + + +# Image metrics +def evaluate_image_similarity(processor, model, data_gold, data_prediction): + images_gold = data_gold["images"].values + images_prediction = data_prediction["images"].values + + metric_per_image = [] + for gold, prediction in tqdm( + zip(images_gold, images_prediction), desc="Image Similarity evaluation" + ): + gold_image = Image.open(gold) + prediction_image = Image.open(prediction) + + gold_inputs = processor(images=gold_image, return_tensors="pt")["pixel_values"] + prediction_inputs = processor(images=prediction_image, return_tensors="pt")[ + "pixel_values" + ] + + with torch.no_grad(): + gold_outputs = model.get_image_features(gold_inputs) + prediction_outputs = model.get_image_features(prediction_inputs) + + cos_sim = F.cosine_similarity(gold_outputs, prediction_outputs) + print("cos_sim: ", cos_sim.item()) + metric_per_image.append(cos_sim.item()) + + metric_dict = {"similarity": np.mean(metric_per_image)} + return metric_dict, {"similarity": metric_per_image} + + +class ImageSimilarity: + def __init__(self, model_id) -> None: + self.processor = CLIPImageProcessor.from_pretrained(model_id) + self.model = CLIPModel.from_pretrained(model_id).eval() + + def evaluate(self, gt, prediction): + return evaluate_image_similarity(self.processor, self.model, gt, prediction) diff --git a/llm_bench/python/who_what_benchmark/whowhatbench/wwb.py b/llm_bench/python/who_what_benchmark/whowhatbench/wwb.py index 8efca22059..3798bb044c 100644 --- a/llm_bench/python/who_what_benchmark/whowhatbench/wwb.py +++ b/llm_bench/python/who_what_benchmark/whowhatbench/wwb.py @@ -5,28 +5,40 @@ import pandas as pd import logging from datasets import load_dataset -from optimum.exporters import TasksManager +from diffusers import DiffusionPipeline from optimum.intel.openvino import OVModelForCausalLM from optimum.utils import NormalizedConfigManager, NormalizedTextConfig from transformers import AutoConfig, AutoTokenizer, AutoModelForCausalLM -from . import Evaluator +from optimum.exporters.tasks import TasksManager +from optimum.intel import ( + OVLatentConsistencyModelPipeline, + OVStableDiffusionPipeline, + OVStableDiffusionXLPipeline, +) + +import openvino_genai +from whowhatbench import EVALUATOR_REGISTRY, MODELTYPE2TASK + # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -TasksManager._SUPPORTED_MODEL_TYPE["stablelm-epoch"] = TasksManager._SUPPORTED_MODEL_TYPE["llama"] +TasksManager._SUPPORTED_MODEL_TYPE["stablelm-epoch"] = ( + TasksManager._SUPPORTED_MODEL_TYPE["llama"] +) NormalizedConfigManager._conf["stablelm-epoch"] = NormalizedTextConfig.with_args( num_layers="num_hidden_layers", num_attention_heads="num_attention_heads", ) -class GenAIModelWrapper(): +class GenAIModelWrapper: """ A helper class to store additional attributes for GenAI models """ + def __init__(self, model, model_dir): self.model = model self.config = AutoConfig.from_pretrained(model_dir) @@ -38,7 +50,7 @@ def __getattr__(self, attr): return getattr(self.model, attr) -def load_genai_pipeline(model_dir, device="CPU"): +def load_text_genai_pipeline(model_dir, device="CPU"): try: import openvino_genai except ImportError: @@ -48,13 +60,17 @@ def load_genai_pipeline(model_dir, device="CPU"): return GenAIModelWrapper(openvino_genai.LLMPipeline(model_dir, device), model_dir) -def load_model(model_id, device="CPU", ov_config=None, use_hf=False, use_genai=False): +def load_text_model( + model_id, device="CPU", ov_config=None, use_hf=False, use_genai=False +): if use_hf: logger.info("Using HF Transformers API") - return AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True, device_map=device.lower()) + return AutoModelForCausalLM.from_pretrained( + model_id, trust_remote_code=True, device_map=device.lower() + ) if use_genai: - return load_genai_pipeline(model_id, device) + return load_text_genai_pipeline(model_id, device) if ov_config: with open(ov_config) as f: @@ -62,7 +78,9 @@ def load_model(model_id, device="CPU", ov_config=None, use_hf=False, use_genai=F else: ov_options = None try: - model = OVModelForCausalLM.from_pretrained(model_id, trust_remote_code=True, device=device, ov_config=ov_options) + model = OVModelForCausalLM.from_pretrained( + model_id, trust_remote_code=True, device=device, ov_config=ov_options + ) except ValueError: config = AutoConfig.from_pretrained(model_id, trust_remote_code=True) model = OVModelForCausalLM.from_pretrained( @@ -71,11 +89,67 @@ def load_model(model_id, device="CPU", ov_config=None, use_hf=False, use_genai=F trust_remote_code=True, use_cache=True, device=device, - ov_config=ov_options + ov_config=ov_options, ) return model +TEXT2IMAGE_TASK2CLASS = { + "sd": OVStableDiffusionPipeline, + "sd-xl": OVStableDiffusionXLPipeline, + "sd-lcm": OVLatentConsistencyModelPipeline, +} + + +def load_text2image_model( + model_type, model_id, device="CPU", ov_config=None, use_hf=False, use_genai=False +): + if ov_config: + with open(ov_config) as f: + ov_options = json.load(f) + else: + ov_options = None + + if use_hf: + return DiffusionPipeline.from_pretrained(model_id, trust_remote_code=True) + + TEXT2IMAGEPipeline = TEXT2IMAGE_TASK2CLASS[model_type] + + try: + model = TEXT2IMAGEPipeline.from_pretrained( + model_id, trust_remote_code=True, device=device, ov_config=ov_options + ) + except ValueError: + config = AutoConfig.from_pretrained(model_id, trust_remote_code=True) + model = TEXT2IMAGEPipeline.from_pretrained( + model_id, + config=config, + trust_remote_code=True, + use_cache=True, + device=device, + ov_config=ov_options, + ) + return model + + +def load_model( + model_type, model_id, device="CPU", ov_config=None, use_hf=False, use_genai=False +): + from .registry import MODELTYPE2TASK + + if model_id is None: + return None + + if model_type == "text": + return load_text_model(model_id, device, ov_config, use_hf, use_genai) + elif MODELTYPE2TASK[model_type] == "image-generation": + return load_text2image_model( + model_type, model_id, device, ov_config, use_hf, use_genai + ) + else: + raise ValueError(f"Unsupported model type: {model_type}") + + def load_prompts(args): if args.dataset is None: return None @@ -93,7 +167,7 @@ def load_prompts(args): res = data[args.dataset_field] - res = {"questions": list(res)} + res = {"prompts": list(res)} return res @@ -127,7 +201,14 @@ def parse_args(): "I defined and not exists them will be generated by base_model evaluation.", ) parser.add_argument( - "--text-encoder", + "--model-type", + type=str, + choices=["text", "sd", "sd-xl", "sd-lcm"], + default="text", + help="Indicated the model type, e.g. 'text', 'sd'.", + ) + parser.add_argument( + "--data-encoder", type=str, default="sentence-transformers/all-mpnet-base-v2", help="Model for measurement of similarity between base_model and target_model." @@ -145,7 +226,7 @@ def parse_args(): parser.add_argument( "--dataset-field", type=str, - default="questions", + default="text", help="The name of field in dataset for prompts. For example question or context in squad." "Will be used only if dataset is defined.", ) @@ -258,44 +339,120 @@ def diff_strings(a: str, b: str, *, use_loguru_colors: bool = False) -> str: def genai_gen_answer(model, tokenizer, question, max_new_tokens, skip_question): - out = model.generate(question, max_new_tokens=max_new_tokens) + config = openvino_genai.GenerationConfig() + config.max_new_tokens = max_new_tokens + out = model.generate(question, config) return out +def get_evaluator(base_model, args): + # config = AutoConfig.from_pretrained(model_id, trust_remote_code=True) + # task = TasksManager.infer_task_from_model(config._name_or_path) + # TODO: Add logic to auto detect task based on model_id (TaskManager does not work for locally saved models) + task = MODELTYPE2TASK[args.model_type] + + try: + EvaluatorCLS = EVALUATOR_REGISTRY[task] + prompts = load_prompts(args) + + if task == "text-generation": + tokenizer = load_tokenizer(args) + return EvaluatorCLS( + base_model=base_model, + gt_data=args.gt_data, + test_data=prompts, + tokenizer=tokenizer, + similarity_model_id=args.data_encoder, + num_samples=args.num_samples, + language=args.language, + gen_answer_fn=genai_gen_answer if args.genai else None, + ) + elif task == "image-generation": + return EvaluatorCLS( + base_model=base_model, + gt_data=args.gt_data, + test_data=prompts, + num_samples=args.num_samples, + ) + else: + raise ValueError(f"Unsupported task: {task}") + + except KeyError: + raise ValueError( + f"Attempted to load evaluator for '{task}', but no evaluator for this model type found!" + "Supported model types: {', '.join(EVALUATOR_REGISTRY.keys())}" + ) + + +def print_text_results(evaluator): + metric_of_interest = "similarity" + worst_examples = evaluator.worst_examples(top_k=5, metric=metric_of_interest) + for i, e in enumerate(worst_examples): + ref_text = "" + actual_text = "" + diff = "" + for l1, l2 in zip( + e["source_model"].splitlines(), e["optimized_model"].splitlines() + ): + if l1 == "" and l2 == "": + continue + ref_text += l1 + "\n" + actual_text += l2 + "\n" + diff += diff_strings(l1, l2) + "\n" + + logger.info( + "--------------------------------------------------------------------------------------" + ) + logger.info("## Reference text %d:\n%s", i + 1, ref_text) + logger.info("## Actual text %d:\n%s", i + 1, actual_text) + logger.info("## Diff %d: ", i + 1) + logger.info(diff) + + +def print_image_results(evaluator): + metric_of_interest = "similarity" + worst_examples = evaluator.worst_examples(top_k=1, metric=metric_of_interest) + for i, e in enumerate(worst_examples): + logger.info( + "--------------------------------------------------------------------------------------" + ) + logger.info(f"Top-{i+1} example:") + logger.info(e) + + def main(): args = parse_args() check_args(args) - prompts = load_prompts(args) - tokenizer = load_tokenizer(args) if args.gt_data and os.path.exists(args.gt_data): - evaluator = Evaluator( - base_model=None, - gt_data=args.gt_data, - test_data=prompts, - tokenizer=tokenizer, - similarity_model_id=args.text_encoder, - num_samples=args.num_samples, - language=args.language, - ) + evaluator = get_evaluator(None, args) else: - base_model = load_model(args.base_model, args.device, args.ov_config, args.hf, args.genai) - evaluator = Evaluator( - base_model=base_model, - test_data=prompts, - tokenizer=tokenizer, - similarity_model_id=args.text_encoder, - num_samples=args.num_samples, - language=args.language, - gen_answer_fn=genai_gen_answer if args.genai else None + base_model = load_model( + args.model_type, + args.base_model, + args.device, + args.ov_config, + args.hf, + args.genai, ) + evaluator = get_evaluator(base_model, args) + if args.gt_data: evaluator.dump_gt(args.gt_data) del base_model if args.target_model: - target_model = load_model(args.target_model, args.device, args.ov_config, args.hf, args.genai) - all_metrics_per_question, all_metrics = evaluator.score(target_model, genai_gen_answer if args.genai else None) + target_model = load_model( + args.model_type, + args.target_model, + args.device, + args.ov_config, + args.hf, + args.genai, + ) + all_metrics_per_question, all_metrics = evaluator.score( + target_model, genai_gen_answer if args.genai else None + ) logger.info("Metrics for model: %s", args.target_model) logger.info(all_metrics) @@ -307,25 +464,11 @@ def main(): df = pd.DataFrame(all_metrics) df.to_csv(os.path.join(args.output, "metrics.csv")) - if args.verbose: - metric_of_interest = "similarity" - worst_examples = evaluator.worst_examples(top_k=5, metric=metric_of_interest) - for i, e in enumerate(worst_examples): - ref_text = "" - actual_text = "" - diff = "" - for l1, l2 in zip(e["source_model"].splitlines(), e["optimized_model"].splitlines()): - if l1 == "" and l2 == "": - continue - ref_text += l1 + "\n" - actual_text += l2 + "\n" - diff += diff_strings(l1, l2) + "\n" - - logger.info("--------------------------------------------------------------------------------------") - logger.info("## Reference text %d:\n%s", i + 1, ref_text) - logger.info("## Actual text %d:\n%s", i + 1, actual_text) - logger.info("## Diff %d: ", i + 1) - logger.info(diff) + if args.verbose and args.target_model is not None: + if args.model_type == "text": + print_text_results(evaluator) + elif "sd" in args.model_type: + print_image_results(evaluator) if __name__ == "__main__": diff --git a/tests/python_tests/test_cache_optimizations.py b/tests/python_tests/test_cache_optimizations.py index 6fdf5446c7..f3125976d2 100644 --- a/tests/python_tests/test_cache_optimizations.py +++ b/tests/python_tests/test_cache_optimizations.py @@ -22,7 +22,7 @@ def load_prompts_dataset(file_name : str) -> Dict[str, List[str]]: file_path = TESTS_ROOT / 'data' / file_name with open(file_path, 'r') as f: - return {"questions": [s for s in f]} + return {"prompts": [s for s in f]} def get_scheduler_config(num_kv_blocks: int) -> SchedulerConfig: scheduler_config = SchedulerConfig() @@ -118,7 +118,7 @@ def test_cache_optimized_generation_is_similar_to_unoptimized(converted_model, t data_dict = load_prompts_dataset(test_struct.prompt_file) - evaluator = whowhatbench.Evaluator(base_model=model_cb_noopt, tokenizer=tokenizer, test_data=data_dict, + evaluator = whowhatbench.TextEvaluator(base_model=model_cb_noopt, tokenizer=tokenizer, test_data=data_dict, generation_config=generation_config, generation_config_base=generation_config, max_new_tokens=test_struct.max_new_tokens, seqs_per_request=seqs_per_request) From ff38f9097b7e050100df2a42efc528f45e7f2570 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 13:10:17 +0400 Subject: [PATCH 10/42] Remove excess comma in src/cpp/CMakeLists.txt (#927) --- src/cpp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt index b726ff2ae3..922c808ed0 100644 --- a/src/cpp/CMakeLists.txt +++ b/src/cpp/CMakeLists.txt @@ -47,7 +47,7 @@ ov_genai_build_jinja2cpp() # Library -file(GLOB_RECURSE SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp", "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c") +file(GLOB_RECURSE SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c") set(TARGET_NAME openvino_genai) add_library(${TARGET_NAME} SHARED ${SOURCE_FILES}) From ff27cf7535d2358bc70a85171275ca14fa2eea03 Mon Sep 17 00:00:00 2001 From: Vladimir Zlobin Date: Tue, 8 Oct 2024 14:10:04 +0400 Subject: [PATCH 11/42] Fix layout description --- src/cpp/include/openvino/genai/vlm_pipeline.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/include/openvino/genai/vlm_pipeline.hpp b/src/cpp/include/openvino/genai/vlm_pipeline.hpp index 21cd80ea23..38595f1b96 100644 --- a/src/cpp/include/openvino/genai/vlm_pipeline.hpp +++ b/src/cpp/include/openvino/genai/vlm_pipeline.hpp @@ -72,7 +72,7 @@ class OPENVINO_GENAI_EXPORTS VLMPipeline { ~VLMPipeline(); /// @brief Generate a response given a prompt and any number of - /// uint8 RGB images with [NHWC] or [HWC] layout. + /// uint8 RGB images with [NCHW] or [CHW] layout. /// @param prompt A prompt to respond to. /// @param images Images to be prepended to a prompt. /// @param generation_config A config to follow for text generation. From a0b78c085472164cd55414578999a57e9e006803 Mon Sep 17 00:00:00 2001 From: Roman Kazantsev Date: Tue, 8 Oct 2024 16:01:55 +0400 Subject: [PATCH 12/42] Update README.md --- samples/cpp/text2image/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/cpp/text2image/README.md b/samples/cpp/text2image/README.md index e1401e8795..eeb051c62d 100644 --- a/samples/cpp/text2image/README.md +++ b/samples/cpp/text2image/README.md @@ -38,7 +38,7 @@ Prompt: `cyberpunk cityscape like Tokyo New York with tall buildings at dusk gol ## Supported models -Models can be downloaded from [HiggingFace](https://huggingface.co/models). This sample can run the following list of models, but not limitied to: +Models can be downloaded from [HuggingFace](https://huggingface.co/models). This sample can run the following list of models, but not limitied to: - [botp/stable-diffusion-v1-5](https://huggingface.co/botp/stable-diffusion-v1-5) - [stabilityai/stable-diffusion-2](https://huggingface.co/stabilityai/stable-diffusion-2) From 8c9a240c23d543cf0eefa732b8a5f0e47f791356 Mon Sep 17 00:00:00 2001 From: Roman Kazantsev Date: Tue, 8 Oct 2024 16:03:06 +0400 Subject: [PATCH 13/42] Update samples/cpp/text2image/README.md --- samples/cpp/text2image/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/cpp/text2image/README.md b/samples/cpp/text2image/README.md index eeb051c62d..2a08ad61b6 100644 --- a/samples/cpp/text2image/README.md +++ b/samples/cpp/text2image/README.md @@ -38,7 +38,7 @@ Prompt: `cyberpunk cityscape like Tokyo New York with tall buildings at dusk gol ## Supported models -Models can be downloaded from [HuggingFace](https://huggingface.co/models). This sample can run the following list of models, but not limitied to: +Models can be downloaded from [HuggingFace](https://huggingface.co/models). This sample can run the following list of models, but not limited to: - [botp/stable-diffusion-v1-5](https://huggingface.co/botp/stable-diffusion-v1-5) - [stabilityai/stable-diffusion-2](https://huggingface.co/stabilityai/stable-diffusion-2) From 93927b5cc126d16238d708f6badc413b209fa1c8 Mon Sep 17 00:00:00 2001 From: Vladimir Zlobin Date: Tue, 8 Oct 2024 14:45:40 +0400 Subject: [PATCH 14/42] MiniCPM-V-2_6 with image input (#912) Ticket 144955, CVS-153301 --------- Co-authored-by: wenyi5608 <93560477+wenyi5608@users.noreply.github.com> Co-authored-by: Yang,Su Co-authored-by: Yaroslav Tarkan Co-authored-by: Alina Kladieva Co-authored-by: Pavel Esir Co-authored-by: Pavel Esir Co-authored-by: Artur Paniukov Co-authored-by: Ekaterina Aidova Co-authored-by: Ilya Lavrenov Co-authored-by: Mikhail Ryzhov --- .github/workflows/causal_lm_cpp.yml | 31 + .github/workflows/mac.yml | 2 +- pyproject.toml | 1 + samples/CMakeLists.txt | 1 + .../cpp/visual_language_chat/CMakeLists.txt | 26 + samples/cpp/visual_language_chat/README.md | 37 + .../export_MiniCPM-V-2_6.py | 965 ++ .../cpp/visual_language_chat/load_image.cpp | 41 + .../cpp/visual_language_chat/load_image.hpp | 12 + .../visual_language_chat.cpp | 55 + samples/requirements.txt | 3 +- src/cpp/CMakeLists.txt | 3 + .../openvino/genai/processor_config.hpp | 46 + .../include/openvino/genai/vision_encoder.hpp | 121 + src/cpp/include/openvino/genai/vlm_config.hpp | 54 + .../include/openvino/genai/vlm_pipeline.hpp | 173 + src/cpp/src/clip.cpp | 319 + src/cpp/src/clip.hpp | 54 + src/cpp/src/processor_config.cpp | 22 + src/cpp/src/stb_image.hpp | 8396 +++++++++++++++++ src/cpp/src/utils.cpp | 25 +- src/cpp/src/utils.hpp | 16 +- src/cpp/src/vision_encoder.cpp | 317 + src/cpp/src/vlm_config.cpp | 17 + src/cpp/src/vlm_pipeline.cpp | 588 ++ src/cpp/src/vlm_sampling.hpp | 96 + src/docs/SUPPORTED_MODELS.md | 23 + 27 files changed, 11432 insertions(+), 12 deletions(-) create mode 100644 samples/cpp/visual_language_chat/CMakeLists.txt create mode 100644 samples/cpp/visual_language_chat/README.md create mode 100644 samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py create mode 100644 samples/cpp/visual_language_chat/load_image.cpp create mode 100644 samples/cpp/visual_language_chat/load_image.hpp create mode 100644 samples/cpp/visual_language_chat/visual_language_chat.cpp create mode 100644 src/cpp/include/openvino/genai/processor_config.hpp create mode 100644 src/cpp/include/openvino/genai/vision_encoder.hpp create mode 100644 src/cpp/include/openvino/genai/vlm_config.hpp create mode 100644 src/cpp/include/openvino/genai/vlm_pipeline.hpp create mode 100644 src/cpp/src/clip.cpp create mode 100644 src/cpp/src/clip.hpp create mode 100644 src/cpp/src/processor_config.cpp create mode 100644 src/cpp/src/stb_image.hpp create mode 100644 src/cpp/src/vision_encoder.cpp create mode 100644 src/cpp/src/vlm_config.cpp create mode 100644 src/cpp/src/vlm_pipeline.cpp create mode 100644 src/cpp/src/vlm_sampling.hpp diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index 8029eda1dc..3feb7c8563 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -681,6 +681,37 @@ jobs: diff pred2.txt ref.txt echo "Chat sample python" passed + py-vlm_chat_sample-ubuntu: + runs-on: ubuntu-22.04-16-cores + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: actions/setup-python@v4 + with: + python-version: 3.11 + - name: Install OpenVINO + run: | + mkdir ./ov/ + curl ${{ env.l_ov_link }} | tar --directory ./ov/ --strip-components 1 -xz + sudo ./ov/install_dependencies/install_openvino_dependencies.sh + - name: Build app + run: | + source ./ov/setupvars.sh + cmake -DCMAKE_BUILD_TYPE=Release -S ./ -B ./build/ + cmake --build ./build/ --config Release --target visual_language_chat -j + - name: Download and convert a model and an image + run: | + source ./ov/setupvars.sh + python -m pip install ./thirdparty/openvino_tokenizers/[transformers] --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly + python -m pip install --upgrade-strategy eager -r ./samples/requirements.txt --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly + python ./samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py ./miniCPM-V-2_6/ + wget https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 + - run: > + source ./ov/setupvars.sh + && timeout 120s ./build/samples/cpp/visual_language_chat/visual_language_chat ./miniCPM-V-2_6/ d5fbbd1a-d484-415c-88cb-9986625b7b11 + <<< $'What is on the image?\nWhat is special on the image?' + cpp-continuous-batching-ubuntu: runs-on: ubuntu-20.04-8-cores defaults: diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index 873961ac45..000f35f280 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -386,7 +386,7 @@ jobs: if: ${{ 'Release' == matrix.build-type }} # Python bindings can be built in Release only run: | source ${OV_INSTALL_DIR}/setupvars.sh - timeout 25s ${OV_INSTALL_DIR}/samples/python/multinomial_causal_lm/multinomial_causal_lm.py ./TinyLlama-1.1B-Chat-v1.0/ 0 + timeout 26s ${OV_INSTALL_DIR}/samples/python/multinomial_causal_lm/multinomial_causal_lm.py ./TinyLlama-1.1B-Chat-v1.0/ 0 Overall_Status: name: ci/gha_overall_status_macos diff --git a/pyproject.toml b/pyproject.toml index b7a23efa98..7be4478108 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ find_python3 = true build_args = ["--parallel", "--target", "py_generate_pipeline"] install_args = ["--strip"] install_components = ["wheel_genai"] +options = {"BUILD_TOKENIZERS" = "OFF"} [build-system] requires = [ diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 9add86a3d7..f6a94dfca9 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -10,6 +10,7 @@ add_subdirectory(cpp/greedy_causal_lm) add_subdirectory(cpp/lora_greedy_causal_lm) add_subdirectory(cpp/multinomial_causal_lm) add_subdirectory(cpp/prompt_lookup_decoding_lm) +add_subdirectory(cpp/visual_language_chat) add_subdirectory(cpp/speculative_decoding_lm) add_subdirectory(cpp/benchmark_genai) add_subdirectory(cpp/whisper_speech_recognition) diff --git a/samples/cpp/visual_language_chat/CMakeLists.txt b/samples/cpp/visual_language_chat/CMakeLists.txt new file mode 100644 index 0000000000..0df2b5ab5c --- /dev/null +++ b/samples/cpp/visual_language_chat/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (C) 2023-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +find_package(OpenVINOGenAI REQUIRED PATHS + "${CMAKE_BINARY_DIR}" # Reuse the package from the build. + ${OpenVINO_DIR} # GenAI may be installed alogside OpenVINO. +) + +file(DOWNLOAD + https://raw.githubusercontent.com/nothings/stb/f75e8d1cad7d90d72ef7a4661f1b994ef78b4e31/stb_image.h + ${CMAKE_BINARY_DIR}/stb_image.h + EXPECTED_HASH MD5=27932e6fb3a2f26aee2fc33f2cb4e696) + +add_executable(visual_language_chat visual_language_chat.cpp load_image.cpp) +target_include_directories(visual_language_chat PRIVATE "${CMAKE_CURRENT_SOUCE_DIR}" "${CMAKE_BINARY_DIR}") +target_link_libraries(visual_language_chat PRIVATE openvino::genai) +set_target_properties(visual_language_chat PROPERTIES + COMPILE_PDB_NAME chat_sample + # Ensure out of box LC_RPATH on macOS with SIP + INSTALL_RPATH_USE_LINK_PATH ON) +target_compile_features(visual_language_chat PRIVATE cxx_std_11) + +install(TARGETS visual_language_chat + RUNTIME DESTINATION samples_bin/ + COMPONENT samples_bin + EXCLUDE_FROM_ALL) diff --git a/samples/cpp/visual_language_chat/README.md b/samples/cpp/visual_language_chat/README.md new file mode 100644 index 0000000000..49d4545850 --- /dev/null +++ b/samples/cpp/visual_language_chat/README.md @@ -0,0 +1,37 @@ +# C++ visual language chat + +This example showcases inference of Visual language models (VLMs): [`openbmb/MiniCPM-V-2_6`](https://huggingface.co/openbmb/MiniCPM-V-2_6). The application doesn't have many configuration options to encourage the reader to explore and modify the source code. For example, change the device for inference to GPU. The sample features `ov::genai::VLMPipeline` and runs the simplest deterministic greedy sampling algorithm. There is also a Jupyter [notebook](https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/minicpm-v-multimodal-chatbot) which provides an example of Visual-language assistant. + +## Download and convert the model and tokenizers + +The `--upgrade-strategy eager` option is needed to ensure `optimum-intel` is upgraded to the latest version. + +It's not required to install [../../requirements.txt](../../requirements.txt) for deployment if the model has already been exported. + +```sh +pip install --upgrade-strategy eager -r ../../requirements.txt +export_MiniCPM-V-2_6.py miniCPM-V-2_6 +``` + +## Run + +https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 can be used as a sample image. + +`visual_language_chat miniCPM-V-2_6 319483352-d5fbbd1a-d484-415c-88cb-9986625b7b11.jpg` + +Discrete GPUs (dGPUs) usually provide better performance compared to CPUs. It is recommended to run larger models on a dGPU with 32GB+ RAM. For example, the model `llava-hf/llava-v1.6-mistral-7b-hf` can benefit from being run on a dGPU. Modify the source code to change the device for inference to the `GPU`. + +See [SUPPORTED_MODELS.md](../../../src/docs/SUPPORTED_MODELS.md#visual-language-models) for the list of supported models. + +### Troubleshooting + +#### Unicode characters encoding error on Windows + +Example error: +``` +UnicodeEncodeError: 'charmap' codec can't encode character '\u25aa' in position 0: character maps to +``` + +If you encounter the error described in the example when sample is printing output to the Windows console, it is likely due to the default Windows encoding not supporting certain Unicode characters. To resolve this: +1. Enable Unicode characters for Windows cmd - open `Region` settings from `Control panel`. `Administrative`->`Change system locale`->`Beta: Use Unicode UTF-8 for worldwide language support`->`OK`. Reboot. +2. Enable UTF-8 mode by setting environment variable `PYTHONIOENCODING="utf8"`. diff --git a/samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py b/samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py new file mode 100644 index 0000000000..a08c3ad55b --- /dev/null +++ b/samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py @@ -0,0 +1,965 @@ +import argparse +import requests +import torch +from threading import Thread +from copy import deepcopy +import shutil +import json +from PIL import Image +from transformers import AutoModel, AutoTokenizer, AutoProcessor, TextIteratorStreamer +from transformers.generation import GenerationMixin +from transformers import AutoConfig, GenerationConfig +from transformers.modeling_outputs import CausalLMOutputWithPast +from pathlib import Path +from huggingface_hub import snapshot_download +import types +from typing import Optional, Tuple, List +from openvino.runtime import opset13 +import openvino as ov +import openvino_tokenizers +import numpy as np +import gc + +text_emb_path = Path("embed_tokens.xml") +image_emb_path = Path("image_encoder.xml") +resampler_path = Path("resampler.xml") +llm_path = Path("language_model.xml") + + +def model_has_state(ov_model: ov.Model): + return len(ov_model.get_sinks()) > 0 + + +def model_has_input_output_name(ov_model: ov.Model, name: str): + """ + Helper function for checking that model has specified input or output name + + Parameters: + ov_model (ov.Model): + name (str): + name of input or output + + Returns: + True if input or output with requested name exists else False + """ + return name in sum([list(t.get_names()) for t in ov_model.inputs + ov_model.outputs], []) + + +def fuse_cache_reorder( + ov_model: ov.Model, + not_kv_inputs: List[str], + key_value_input_names: List[str], + gather_dim: int, +): + """ + Fuses reored_cache during generate cycle into ov.Model. Used with stateful models, because we can not modify model state directly. + + Adds a new beam_idx parameter and Gather op per each kv-cache input in a given model. + Should be run before make_stateful. Implements optimumum's _reorder_cache + inside the model in the beginning of each iteration. + Gather works along given gather_dim dimension that may vary from model to model. + KV-cache inputs are identified based on names in key_value_input_names. + Append the new beam_idx parameter to not_kv_inputs. + + Parameters: + ov_model (`ov.Model`): + openvino model for processing + not_kv_inputs (`List[str]`): + list of input nodes in model that not related to past key values + key_value_input_names (`List[str]`): + list of names for key value input layers + gather_dim (int): + dimension for gathering cache during reorder pass + """ + + if model_has_input_output_name(ov_model, "beam_idx"): + raise ValueError("Model already has fused cache") + input_batch = ov_model.input("inputs_embeds").get_partial_shape()[0] + beam_idx = opset13.parameter(name="beam_idx", dtype=ov.Type.i32, shape=ov.PartialShape([input_batch])) + beam_idx.output(0).get_tensor().add_names({"beam_idx"}) + ov_model.add_parameters([beam_idx]) + not_kv_inputs.append(ov_model.inputs[-1]) + # Go over all cache parameters and fuse _reorder_cache with indices provided by the new parameter beam_idx + for input_name in key_value_input_names: + parameter_output_port = ov_model.input(input_name) + consumers = parameter_output_port.get_target_inputs() + gather = opset13.gather(parameter_output_port, beam_idx, opset13.constant(gather_dim)) + for consumer in consumers: + consumer.replace_source_output(gather.output(0)) + ov_model.validate_nodes_and_infer_types() + + +def build_state_initializer(ov_model: ov.Model, batch_dim: int): + """ + Build initialization ShapeOf Expression for all ReadValue ops + + Parameters: + ov_model (ov.Model): + openvino model + batch_dim (int): + index of dimension corresponding to batch size + """ + input_ids = ov_model.input("inputs_embeds") + batch = opset13.gather( + opset13.shape_of(input_ids, output_type="i64"), + opset13.constant([0]), + opset13.constant(0), + ) + for op in ov_model.get_ops(): + if op.get_type_name() == "ReadValue": + dims = [dim.min_length for dim in list(op.get_output_partial_shape(0))] + dims[batch_dim] = batch + dims = [(opset13.constant(np.array([dim], dtype=np.int64)) if isinstance(dim, int) else dim) for dim in dims] + shape = opset13.concat(dims, axis=0) + broadcast = opset13.broadcast(opset13.constant(0.0, dtype=op.get_output_element_type(0)), shape) + op.set_arguments([broadcast]) + ov_model.validate_nodes_and_infer_types() + + +def make_stateful( + ov_model: ov.Model, + not_kv_inputs: List[str], + key_value_input_names: List[str], + key_value_output_names: List[str], + batch_dim: int, + num_attention_heads: int, + num_beams_and_batch: int = None, +): + """ + Hides kv-cache inputs and outputs inside the model as variables. + + Parameters: + ov_model (ov.Model): + openvino model + not_kv_inputs (`List[str]`): + list of input nodes in model that not related to past key values + key_value_input_names (`List[str]`): + list of names for key value input layers + key_value_output_names (`List[str]`): + list of names for key value input layers + batch_dim (int): + index of batch dimension in key value layers + num_attention_heads (int): + number of attention heads for batch dimension initialization + num_beams_an_batch (int): + precalculated number of beams and batch for shapes initialization + """ + from openvino._offline_transformations import apply_make_stateful_transformation + + input_output_map = {} + + if num_beams_and_batch is not None: + # Set batch size for input_ids and attention mask to avoid dynamic dimension got propagated from the end of the model back to ReadValue + for input in not_kv_inputs: + shape = input.get_partial_shape() + if shape.rank.get_length() <= 2: # == 1 for beam_index + shape[0] = num_beams_and_batch + input.get_node().set_partial_shape(shape) + for kv_name_pair in zip(key_value_input_names, key_value_output_names): + input_output_map[kv_name_pair[0]] = kv_name_pair[1] + if num_beams_and_batch is not None: + input = ov_model.input(kv_name_pair[0]) + shape = input.get_partial_shape() + shape[batch_dim] = num_beams_and_batch * num_attention_heads + input.get_node().set_partial_shape(shape) + + if num_beams_and_batch is not None: + # Re-validation model if shapes are altered above + ov_model.validate_nodes_and_infer_types() + + apply_make_stateful_transformation(ov_model, input_output_map) + if num_beams_and_batch is None: + build_state_initializer(ov_model, batch_dim) + + +def patch_stateful(ov_model): + key_value_input_names = [key.get_any_name() for key in ov_model.inputs[2:-1]] + key_value_output_names = [key.get_any_name() for key in ov_model.outputs[1:]] + not_kv_inputs = [input for input in ov_model.inputs if not any(name in key_value_input_names for name in input.get_names())] + if not key_value_input_names or not key_value_output_names: + return + batch_dim = 0 + num_attention_heads = 1 + + fuse_cache_reorder(ov_model, not_kv_inputs, key_value_input_names, batch_dim) + make_stateful( + ov_model, + not_kv_inputs, + key_value_input_names, + key_value_output_names, + batch_dim, + num_attention_heads, + None, + ) + + +def cleanup_torchscript_cache(): + """ + Helper for removing cached model representation + """ + torch._C._jit_clear_class_registry() + torch.jit._recursive.concrete_type_store = torch.jit._recursive.ConcreteTypeStore() + torch.jit._state._clear_class_state() + + +def get_2d_sincos_pos_embed(embed_dim, image_size): + """ + image_size: image_size or (image_height, image_width) + return: + pos_embed: [image_height, image_width, embed_dim] + """ + if isinstance(image_size, int): + grid_h_size, grid_w_size = image_size, image_size + else: + grid_h_size, grid_w_size = image_size[0], image_size[1] + + grid_h = np.arange(grid_h_size, dtype=np.float32) + grid_w = np.arange(grid_w_size, dtype=np.float32) + grid = np.meshgrid(grid_w, grid_h) # here w goes first + grid = np.stack(grid, axis=0) + + pos_embed = get_2d_sincos_pos_embed_from_grid(embed_dim, grid) + return pos_embed + + +def get_2d_sincos_pos_embed_from_grid(embed_dim, grid): + assert embed_dim % 2 == 0 + + # use half of dimensions to encode grid_h + emb_h = get_1d_sincos_pos_embed_from_grid_new(embed_dim // 2, grid[0]) # (H, W, D/2) + emb_w = get_1d_sincos_pos_embed_from_grid_new(embed_dim // 2, grid[1]) # (H, W, D/2) + + emb = np.concatenate([emb_h, emb_w], axis=-1) # (H, W, D) + return emb + + +def get_1d_sincos_pos_embed_from_grid_new(embed_dim, pos): + """ + embed_dim: output dimension for each position + pos: a list of positions to be encoded: size (H, W) + out: (H, W, D) + """ + assert embed_dim % 2 == 0 + omega = np.arange(embed_dim // 2, dtype=np.float32) + omega /= embed_dim / 2.0 + omega = 1.0 / 10000**omega # (D/2,) + + out = np.einsum("hw,d->hwd", pos, omega) # (H, W, D/2), outer product + + emb_sin = np.sin(out) # (H, W, D/2) + emb_cos = np.cos(out) # (H, W, D/2) + + emb = np.concatenate([emb_sin, emb_cos], axis=-1) # (H, W, D) + return emb + + +def patch_model_code(orig_model_dir): + model_file = orig_model_dir / "modeling_navit_siglip.py" + orig_model_file = model_file.parent / ("orig_" + model_file.name) + if not orig_model_file.exists(): + model_file.rename(orig_model_file) + with orig_model_file.open("r") as f: + content = f.read() + content = content.replace("if is_flash_attn_2_available():", "") + content = content.replace("from flash_attn import flash_attn_func, flash_attn_varlen_func", "") + content = content.replace("from flash_attn.bert_padding import index_first_axis, pad_input, unpad_input", "") + + with model_file.open("w") as out_f: + out_f.write(content) + + +def convert_llm(model, model_dir): + model.llm.config.save_pretrained(model_dir / text_emb_path.parent) + print("⌛ Convert Input embedding model") + ov_model = ov.convert_model(model.llm.model.embed_tokens, example_input=torch.ones([1, 10], dtype=torch.long)) + + ov.save_model(ov_model, model_dir / text_emb_path) + del ov_model + cleanup_torchscript_cache() + gc.collect() + print("✅ Input embedding model successfully converted") + + print("⌛ Convert Language model") + hidden_size = model.llm.config.hidden_size + num_pkv = model.llm.config.num_hidden_layers + pkv_shape = (2, model.llm.config.num_key_value_heads, 2, hidden_size // model.llm.config.num_attention_heads) + + input_embeds = torch.randn((2, 2, hidden_size)) + attention_mask = torch.ones([2, 4], dtype=torch.long) + position_ids = torch.tensor([[2, 3], [2, 3]], dtype=torch.long) + input_names = ["attention_mask", "position_ids"] + output_names = ["logits"] + + past_key_values = [] + for i in range(num_pkv): + kv = [torch.randn(pkv_shape) for _ in range(2)] + past_key_values.append(kv) + input_names.extend([f"past_key_values.{i}.key", f"past_key_values.{i}.value"]) + output_names.extend([f"present.{i}.key", f"present.{i}.value"]) + input_names.append("inputs_embeds") + + example_input = {"inputs_embeds": input_embeds, "attention_mask": attention_mask, "position_ids": position_ids, "past_key_values": past_key_values} + + model.llm.config.torchscript = True + + ov_model = ov.convert_model(model.llm, example_input=example_input) + + for out, out_name in zip(ov_model.outputs, output_names): + out.get_tensor().set_names({out_name}) + + for inp, inp_name in zip(ov_model.inputs, input_names): + inp.get_tensor().set_names({inp_name}) + + patch_stateful(ov_model) + + ov.save_model(ov_model, model_dir / llm_path) + del ov_model + + cleanup_torchscript_cache() + gc.collect() + print("✅ Language model successfully converted") + + +def convert_vision_encoder(model, model_dir): + tgt_sizes = torch.tensor([[23, 45]]) + if not (model_dir / image_emb_path).exists(): + print("⌛ Convert Image embedding model") + pixel_values = torch.randn([1, 3, 14, 14490]) + patch_attn_mask = torch.zeros((1, 1, 1035), dtype=torch.bool) + patch_attn_mask[0, 0, : tgt_sizes[0][0] * tgt_sizes[0][1]] = True + ov_model = ov.convert_model(model.vpm, example_input={"pixel_values": pixel_values, "tgt_sizes": tgt_sizes, "patch_attention_mask": patch_attn_mask}) + ov.save_model(ov_model, model_dir / image_emb_path) + del ov_model + cleanup_torchscript_cache() + print("✅ Image embedding model successfully converted") + + if not (model_dir / resampler_path).exists(): + print("⌛ Convert Resamler model") + + def resampler_forward(self, x, pos_embed, key_padding_mask): + bs = x.shape[0] + x = self.kv_proj(x) # B * L * D + x = self.ln_kv(x).permute(1, 0, 2) # L * B * D + + q = self.ln_q(self.query) # Q * D + + out = self.attn(self._repeat(q, bs), x + pos_embed, x, key_padding_mask=key_padding_mask)[0] # Q * B * D # L * B * D + L * B * D + # out: Q * B * D + x = out.permute(1, 0, 2) # B * Q * D + + x = self.ln_post(x) + x = x @ self.proj + return x + + model.resampler.forward = types.MethodType(resampler_forward, model.resampler) + + pos_embed_base = get_2d_sincos_pos_embed(model.resampler.embed_dim, 70) + + patch_len = tgt_sizes[:, 0] * tgt_sizes[:, 1] + + max_patch_len = torch.max(patch_len) + key_padding_mask = torch.zeros((1, max_patch_len), dtype=torch.bool) + + pos_embed = [] + tgt_h, tgt_w = tgt_sizes[0] + pos_embed = torch.from_numpy(pos_embed_base[:tgt_h, :tgt_w, :].reshape((tgt_h * tgt_w, 1, -1))) # patches * D + key_padding_mask[0, patch_len:] = True + + ov_model = ov.convert_model(model.resampler, example_input=[torch.randn(1, 1035, 1152), pos_embed, key_padding_mask]) + ov.save_model(ov_model, model_dir / resampler_path) + del ov_model + cleanup_torchscript_cache() + print("✅ Resampler model successfully converted") + + +def copy_llm_files(model_dir, dst_dir): + shutil.copy(model_dir / text_emb_path, model_dir / dst_dir / text_emb_path.name) + shutil.copy(model_dir / text_emb_path.with_suffix(".bin"), model_dir / dst_dir / text_emb_path.with_suffix(".bin").name) + shutil.copy(model_dir / llm_path.parent / "config.json", model_dir / dst_dir / "config.json") + shutil.copy(model_dir / llm_path.parent / "configuration_minicpm.py", model_dir / dst_dir / "configuration_minicpm.py") + shutil.copy(model_dir / llm_path.parent / "modeling_navit_siglip.py", model_dir / dst_dir / "modeling_navit_siglip.py") + + +core = ov.Core() + + +class OvModelForCausalLMWithEmb(GenerationMixin): + def __init__(self, model_dir, device="CPU", ov_config=None, compile=True) -> None: + self._supports_cache_class = False + self.config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True) + self.config.is_decoder = True + self.config.is_encoder_decoder = False + self.generation_config = GenerationConfig.from_model_config(self.config) + model_dir = Path(model_dir) + self.model = core.read_model(model_dir / "language_model.xml") + self.token_emb = core.read_model(model_dir / "embed_tokens.xml") + self.request = None + self.token_emb_request = None + self._device = device.upper() + self.device = torch.device("cpu") + self.ov_config = ov_config + self.next_beam_idx = None + self._past_length = None + self.input_names = [input_t.get_any_name() for input_t in self.model.inputs] + self.main_input_name = "input_ids" + if compile: + self.compile() + + def compile(self): + if self.request is None: + self.request = core.compile_model(self.model, self._device, self.ov_config).create_infer_request() + self._compile_token_emb() + + def _compile_token_emb(self): + if self.token_emb_request is None: + self.token_emb_request = core.compile_model(self.token_emb, self._device, self.ov_config) + + def to(self, device: str): + if isinstance(device, str): + self._device = device.upper() + self.clear_requests() + + return self + + def clear_requests(self): + del self.request + del self.token_emb_request + self.request = None + self.token_emb_request = None + + def embed_tokens(self, input_ids: torch.LongTensor): + self._compile_token_emb() + res = self.token_emb_request(input_ids, share_inputs=True) + return res[0] + + def prepare_inputs( + self, + input_ids: torch.LongTensor, + attention_mask: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.FloatTensor]]] = None, + position_ids: Optional[torch.LongTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + **kwargs, + ): + batch_size = input_ids.shape[0] if input_ids is not None else inputs_embeds.shape[0] + + inputs = {} + # past_key_values are not used explicitly, instead they are handled inside the model + if past_key_values is None: + # This is the first iteration in a sequence, reset all states + if self.request is not None: + self.request.reset_state() + # Set initial value for the next beam_idx input that will be used at the current iteration + # and will be optionally updated by _reorder_cache at the next iterations if beam_search is used + self.next_beam_idx = np.arange(batch_size, dtype=int) + self._past_length = 0 + past_len = self._get_past_length(past_key_values) + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids if past_key_values is None else input_ids[:, -1:]) + + if hasattr(self.config, "scale_emb"): + inputs_embeds = inputs_embeds * self.config.scale_emb + inputs["inputs_embeds"] = inputs_embeds + + # Add the attention_mask inputs when needed + if "attention_mask" in self.input_names or "position_ids" in self.input_names: + if attention_mask is not None: + attention_mask = np.array(attention_mask) + else: + attention_mask = np.ones((inputs_embeds.shape[0], inputs_embeds.shape[1] + past_len), dtype=int) + + if "attention_mask" in self.input_names: + inputs["attention_mask"] = attention_mask + + if "position_ids" in self.input_names: + if position_ids is not None: + position_ids = np.array(position_ids) + else: + position_ids = np.cumsum(attention_mask, axis=1) - 1 + position_ids[attention_mask == 0] = 1 + if past_key_values: + position_ids = position_ids[:, -input_ids.shape[1] :] + + inputs["position_ids"] = position_ids + + if "beam_idx" in self.input_names: + inputs["beam_idx"] = self.next_beam_idx if self.next_beam_idx is not None else np.arange(batch_size, dtype=int) + + return inputs + + def forward( + self, + input_ids: torch.LongTensor, + attention_mask: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.FloatTensor]]] = None, + position_ids: Optional[torch.LongTensor] = None, + inputs_embeds: Optional[torch.LongTensor] = None, + **kwargs, + ): + self.compile() + + inputs = self.prepare_inputs( + input_ids=input_ids, + attention_mask=attention_mask, + past_key_values=past_key_values, + position_ids=position_ids, + inputs_embeds=inputs_embeds, + **kwargs, + ) + + # Run inference + self.request.start_async(inputs, share_inputs=True) + self.request.wait() + logits = self.request.get_tensor("logits").data + logits = torch.from_numpy(logits).to(self.device) + past_key_values = ((),) + self._past_length += inputs["inputs_embeds"].shape[1] + + return CausalLMOutputWithPast(logits=logits, past_key_values=past_key_values) + + # Adapted from transformers.models.llama.modeling_llama.LlamaForCausalLM.prepare_inputs_for_generation + def prepare_inputs_for_generation(self, input_ids, past_key_values=None, inputs_embeds=None, **kwargs): + # if model is used as a decoder in encoder-decoder model, the decoder attention mask is created on the fly + attention_mask = kwargs.get("attention_mask", None) + use_cache = kwargs.get("use_cache", None) + + if past_key_values is not None: + past_len = self._get_past_length(past_key_values) + # Keep only the unprocessed tokens: + # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where + # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as + # input) + if attention_mask is not None and input_ids is not None and attention_mask.shape[1] > input_ids.shape[1]: + input_ids = input_ids[:, -(attention_mask.shape[1] - past_len) :] + # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard + # input_ids based on the past_length. + elif input_ids is not None and past_len < input_ids.shape[1]: + input_ids = input_ids[:, past_len:] + # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None and "position_ids" in self.input_names: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values and input_ids is not None: + position_ids = position_ids[:, -input_ids.shape[1] :] + + model_inputs = { + "input_ids": input_ids, + "past_key_values": past_key_values, + "use_cache": use_cache, + "position_ids": position_ids, + "attention_mask": attention_mask, + "inputs_embeds": inputs_embeds if past_key_values is None else None, + } + + return model_inputs + + def _get_past_length(self, past_key_values=None): + if past_key_values is None: + return 0 + return self._past_length + + # Adapted from transformers.models.gpt2.modeling_gpt2.GPT2LMHeadModel._reorder_cache + def _reorder_cache(self, past_key_values: Tuple[Tuple[torch.Tensor]], beam_idx: torch.Tensor) -> Tuple[Tuple[torch.Tensor]]: + """ + This function is used to re-order the `past_key_values` cache if [`~PreTrainedModel.beam_search`] or + [`~PreTrainedModel.beam_sample`] is called. + This is required to match `past_key_values` with the correct beam_idx at every generation step. + """ + self.next_beam_idx = np.array(beam_idx) # save beam_idx to be used as an input in the next iteration + return past_key_values + + def can_generate(self): + """Returns True to validate the check that the model using `GenerationMixin.generate()` can indeed generate.""" + + return True + + def __call__(self, *args, **kwargs): + return self.forward(*args, **kwargs) + + +class OvMiniCPMV: + def __init__(self, config, vpm, resampler, llm, processor): + self.config = config + self.llm = llm + self.vpm = vpm + self.embed_dim = self.llm.config.hidden_size + self._resampler = resampler + self.processor = processor + self._pos_embeds = torch.from_numpy(get_2d_sincos_pos_embed(self.embed_dim, 70)).float() + self.max_size = (70, 70) + + self.terminators = ["<|im_end|>", "<|endoftext|>"] + + def set_decoder(self, decoder): + self.llm = decoder + + def get_decoder(self): + return self.llm + + def resampler(self, x, tgt_sizes): + bs = x.shape[0] + + patch_len = tgt_sizes[:, 0] * tgt_sizes[:, 1] + + self._adjust_pos_cache(tgt_sizes) + + max_patch_len = torch.max(patch_len) + key_padding_mask = torch.zeros((bs, max_patch_len), dtype=torch.bool) + + pos_embed = [] + for i in range(bs): + tgt_h, tgt_w = tgt_sizes[i] + pos_embed.append(self._pos_embeds[:tgt_h, :tgt_w, :].reshape((tgt_h * tgt_w, -1))) # patches * D + key_padding_mask[i, patch_len[i] :] = True + + pos_embed = torch.nn.utils.rnn.pad_sequence(pos_embed, batch_first=True, padding_value=0.0).permute(1, 0, 2) # BLD => L * B * D + + res = torch.from_numpy(self._resampler([x, pos_embed, key_padding_mask])[0]) + return res + + def _set_2d_pos_cache(self, max_size): + pos_embed = torch.from_numpy(get_2d_sincos_pos_embed(self.embed_dim, max_size)).float() + self._pos_embed = pos_embed + + def _adjust_pos_cache(self, tgt_sizes): + max_h = torch.max(tgt_sizes[:, 0]) + max_w = torch.max(tgt_sizes[:, 1]) + if max_h > self.max_size[0] or max_w > self.max_size[1]: + self.max_size = [max(max_h, self.max_size[0]), max(max_w, self.max_size[1])] + self._set_2d_pos_cache(self.max_size) + + def get_vllm_embedding(self, data): + if "vision_hidden_states" not in data: + tgt_sizes = data["tgt_sizes"] + pixel_values_list = data["pixel_values"] + vision_hidden_states = [] + all_pixel_values = [] + img_cnt = [] + for pixel_values in pixel_values_list: + img_cnt.append(len(pixel_values)) + all_pixel_values.extend([i.flatten(end_dim=1).permute(1, 0) for i in pixel_values]) + + # exist image + if all_pixel_values: + tgt_sizes = [tgt_size for tgt_size in tgt_sizes if isinstance(tgt_size, torch.Tensor)] + tgt_sizes = torch.vstack(tgt_sizes).type(torch.int32) + + max_patches = torch.max(tgt_sizes[:, 0] * tgt_sizes[:, 1]) + + all_pixel_values = torch.nn.utils.rnn.pad_sequence(all_pixel_values, batch_first=True, padding_value=0.0) + B, L, _ = all_pixel_values.shape + all_pixel_values = all_pixel_values.permute(0, 2, 1).reshape(B, 3, -1, L) + + patch_attn_mask = torch.zeros((B, 1, max_patches), dtype=torch.bool) + for i in range(B): + patch_attn_mask[i, 0, : tgt_sizes[i][0] * tgt_sizes[i][1]] = True + + vision_batch_size = 1 + all_pixel_values = all_pixel_values + if B > vision_batch_size: + hs = [] + for i in range(0, B, vision_batch_size): + start_idx = i + end_idx = i + vision_batch_size + tmp_hs = torch.from_numpy( + self.vpm([all_pixel_values[start_idx:end_idx], patch_attn_mask[start_idx:end_idx], tgt_sizes[start_idx:end_idx]])[0] + ) + hs.append(tmp_hs) + vision_embedding = torch.cat(hs, dim=0) + else: + vision_embedding = torch.from_numpy(self.vpm([all_pixel_values, patch_attn_mask, tgt_sizes])[0]) + vision_embedding = self.resampler(vision_embedding, tgt_sizes) + + start = 0 + for pixel_values in pixel_values_list: + img_cnt = len(pixel_values) + if img_cnt > 0: + vision_hidden_states.append(vision_embedding[start : start + img_cnt]) + start += img_cnt + else: + vision_hidden_states.append([]) + else: # no image + dummy_feature = [] + for _ in range(len(pixel_values_list)): + vision_hidden_states.append(dummy_feature) + + else: + vision_hidden_states = data["vision_hidden_states"] + + if hasattr(self.llm.config, "scale_emb"): + vllm_embedding = self.llm.embed_tokens(data["input_ids"]) * self.llm.config.scale_emb + else: + vllm_embedding = self.llm.embed_tokens(data["input_ids"]) + + bs = len(data["input_ids"]) + for i in range(bs): + cur_vs_hs = vision_hidden_states[i] + if len(cur_vs_hs) > 0: + cur_vllm_emb = torch.from_numpy(vllm_embedding[i]) + cur_image_bound = data["image_bound"][i] + if len(cur_image_bound) > 0: + image_indices = torch.stack([torch.arange(r[0], r[1], dtype=torch.long) for r in cur_image_bound]) + + cur_vllm_emb.scatter_(0, image_indices.view(-1, 1).repeat(1, cur_vllm_emb.shape[-1]), cur_vs_hs.view(-1, cur_vs_hs.shape[-1])) + return vllm_embedding + + def forward(self, data, **kwargs): + vllm_embedding = self.get_vllm_embedding(data) + position_ids = data["position_ids"] + if position_ids.dtype != torch.int64: + position_ids = position_ids.long() + + return self.llm(input_ids=None, position_ids=position_ids, inputs_embeds=vllm_embedding, **kwargs) + + def _decode(self, inputs_embeds, tokenizer, attention_mask, decode_text=False, **kwargs): + terminators = [tokenizer.convert_tokens_to_ids(i) for i in self.terminators] + output = self.llm.generate( + inputs_embeds=torch.from_numpy(inputs_embeds), pad_token_id=0, eos_token_id=terminators, attention_mask=attention_mask, **kwargs + ) + if decode_text: + return self._decode_text(output, tokenizer) + return output + + def _decode_stream(self, inputs_embeds, tokenizer, **kwargs): + terminators = [tokenizer.convert_tokens_to_ids(i) for i in self.terminators] + streamer = TextIteratorStreamer(tokenizer=tokenizer) + generation_kwargs = {"inputs_embeds": torch.from_numpy(inputs_embeds), "pad_token_id": 0, "eos_token_id": terminators, "streamer": streamer} + generation_kwargs.update(kwargs) + + thread = Thread(target=self.llm.generate, kwargs=generation_kwargs) + thread.start() + + return streamer + + def _decode_text(self, result_ids, tokenizer): + terminators = [tokenizer.convert_tokens_to_ids(i) for i in self.terminators] + result_text = [] + for result in result_ids: + result = result[result != 0] + if result[0] == tokenizer.bos_id: + result = result[1:] + if result[-1] in terminators: + result = result[:-1] + result_text.append(tokenizer.decode(result).strip()) + return result_text + + def generate( + self, + input_ids=None, + pixel_values=None, + tgt_sizes=None, + image_bound=None, + attention_mask=None, + tokenizer=None, + vision_hidden_states=None, + return_vision_hidden_states=False, + stream=False, + decode_text=False, + **kwargs, + ): + assert input_ids is not None + assert len(input_ids) == len(pixel_values) + + model_inputs = { + "input_ids": input_ids, + "image_bound": image_bound, + } + + if vision_hidden_states is None: + model_inputs["pixel_values"] = pixel_values + model_inputs["tgt_sizes"] = tgt_sizes + else: + model_inputs["vision_hidden_states"] = vision_hidden_states + + with torch.inference_mode(): + model_inputs["inputs_embeds"] = self.get_vllm_embedding(model_inputs) + + if stream: + result = self._decode_stream(model_inputs["inputs_embeds"], tokenizer, **kwargs) + else: + result = self._decode(model_inputs["inputs_embeds"], tokenizer, attention_mask, decode_text=decode_text, **kwargs) + + return result + + def chat( + self, + image, + msgs, + tokenizer, + processor=None, + vision_hidden_states=None, + max_new_tokens=2048, + min_new_tokens=0, + sampling=True, + max_inp_length=8192, + system_prompt="", + stream=False, + max_slice_nums=None, + use_image_id=None, + **kwargs, + ): + if isinstance(msgs[0], list): + batched = True + else: + batched = False + msgs_list = msgs + images_list = image + + if batched is False: + images_list, msgs_list = [images_list], [msgs_list] + else: + assert images_list is None, "Please integrate image to msgs when using batch inference." + images_list = [None] * len(msgs_list) + assert len(images_list) == len(msgs_list), "The batch dim of images_list and msgs_list should be the same." + + if processor is None: + if self.processor is None: + self.processor = AutoProcessor.from_pretrained(self.config._name_or_path, trust_remote_code=True) + processor = self.processor + + assert ( + self.config.query_num == processor.image_processor.image_feature_size + ), "These two values should be the same. Check `config.json` and `preprocessor_config.json`." + assert ( + self.config.patch_size == processor.image_processor.patch_size + ), "These two values should be the same. Check `config.json` and `preprocessor_config.json`." + assert ( + self.config.use_image_id == processor.image_processor.use_image_id + ), "These two values should be the same. Check `config.json` and `preprocessor_config.json`." + assert ( + self.config.slice_config.max_slice_nums == processor.image_processor.max_slice_nums + ), "These two values should be the same. Check `config.json` and `preprocessor_config.json`." + assert ( + self.config.slice_mode == processor.image_processor.slice_mode + ), "These two values should be the same. Check `config.json` and `preprocessor_config.json`." + + prompts_lists = [] + input_images_lists = [] + for image, msgs in zip(images_list, msgs_list): + if isinstance(msgs, str): + msgs = json.loads(msgs) + copy_msgs = deepcopy(msgs) + + assert len(msgs) > 0, "msgs is empty" + assert sampling or not stream, "if use stream mode, make sure sampling=True" + + if image is not None and isinstance(copy_msgs[0]["content"], str): + copy_msgs[0]["content"] = [image, copy_msgs[0]["content"]] + + images = [] + for i, msg in enumerate(copy_msgs): + role = msg["role"] + content = msg["content"] + assert role in ["user", "assistant"] + if i == 0: + assert role == "user", "The role of first msg should be user" + if isinstance(content, str): + content = [content] + cur_msgs = [] + for c in content: + if isinstance(c, Image.Image): + images.append(c) + cur_msgs.append("(./)") + elif isinstance(c, str): + cur_msgs.append(c) + msg["content"] = "\n".join(cur_msgs) + + if system_prompt: + sys_msg = {"role": "system", "content": system_prompt} + copy_msgs = [sys_msg] + copy_msgs + + prompts_lists.append(processor.tokenizer.apply_chat_template(copy_msgs, tokenize=False, add_generation_prompt=True)) + input_images_lists.append(images) + + inputs = processor( + prompts_lists, input_images_lists, max_slice_nums=max_slice_nums, use_image_id=use_image_id, return_tensors="pt", max_length=max_inp_length + ) + + if sampling: + generation_config = {"top_p": 0.8, "top_k": 100, "temperature": 0.7, "do_sample": True, "repetition_penalty": 1.05} + else: + generation_config = { + "num_beams": 3, + "repetition_penalty": 1.2, + } + + if min_new_tokens > 0: + generation_config["min_new_tokens"] = min_new_tokens + + generation_config.update((k, kwargs[k]) for k in generation_config.keys() & kwargs.keys()) + generation_config = {"do_sample": False, "repetition_penalty": None} + + inputs.pop("image_sizes") + with torch.inference_mode(): + res = self.generate( + **inputs, + tokenizer=tokenizer, + max_new_tokens=max_new_tokens, + vision_hidden_states=vision_hidden_states, + stream=stream, + decode_text=True, + **generation_config, + ) + + if stream: + + def stream_gen(): + for text in res: + for term in self.terminators: + text = text.replace(term, "") + yield text + + return stream_gen() + + else: + if batched: + answer = res + else: + answer = res[0] + return answer + + +def init_model(model_dir, device): + config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True) + llm = OvModelForCausalLMWithEmb(model_dir, device) + img_emb = core.compile_model(model_dir / image_emb_path, device) + resampler = core.compile_model(model_dir / resampler_path, device) + processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True) + + ov_model = OvMiniCPMV(config, img_emb, resampler, llm, processor) + return ov_model + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("model_dir", type=Path) + model_dir = parser.parse_args().model_dir + model_id = "openbmb/MiniCPM-V-2_6" + ckpt = model_dir / "ckpt" + if not ckpt.exists(): + snapshot_download(model_id, local_dir=ckpt, force_download=True) + patch_model_code(ckpt) + model = AutoModel.from_pretrained(ckpt, trust_remote_code=True) + model.eval() + model.config.save_pretrained(model_dir) + tokenizer = AutoTokenizer.from_pretrained(ckpt, trust_remote_code=True) + tokenizer.save_pretrained(model_dir) + ov_tokenizer, ov_detokenizer = openvino_tokenizers.convert_tokenizer(tokenizer, with_detokenizer=True) + ov.save_model(ov_tokenizer, model_dir / "openvino_tokenizer.xml") + ov.save_model(ov_detokenizer, model_dir / "openvino_detokenizer.xml") + processor = AutoProcessor.from_pretrained(ckpt, trust_remote_code=True) + processor.save_pretrained(model_dir) + + convert_llm(model, model_dir) + del model.llm + gc.collect() + + convert_vision_encoder(model, model_dir) + ov_cpm = init_model(model_dir, "CPU") + print(ov_cpm.chat(Image.open(requests.get("https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11", stream=True).raw), [{"role": "user", "content": "What is unusual on this image?"}], ov_cpm.processor.tokenizer)) + +if "__main__" == __name__: + main() diff --git a/samples/cpp/visual_language_chat/load_image.cpp b/samples/cpp/visual_language_chat/load_image.cpp new file mode 100644 index 0000000000..85fe7e2fbe --- /dev/null +++ b/samples/cpp/visual_language_chat/load_image.cpp @@ -0,0 +1,41 @@ + +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" +#include "load_image.hpp" + +ov::Tensor utils::load_image(const std::filesystem::path& image_path) { + int x = 0, y = 0, channels_in_file = 0; + constexpr int desired_channels = 3; + unsigned char* image = stbi_load( + image_path.string().c_str(), + &x, &y, &channels_in_file, desired_channels); + if (!image) { + throw std::runtime_error{"Failed to load the image"}; + } + struct SharedImageAllocator { + unsigned char* image; + int channels, height, width; + void* allocate(size_t bytes, size_t) const { + if (channels * height * width == bytes) { + return image; + } + throw std::runtime_error{"Unexpected number of bytes was requested to allocate"}; + } + void deallocate(void*, size_t bytes, size_t) { + if (channels * height * width != bytes) { + throw std::runtime_error{"Unexpected number of bytes was requested to deallocate"}; + } + std::free(image); + image = nullptr; + } + bool is_equal(const SharedImageAllocator& other) const noexcept {return this == &other;} + }; + return ov::Tensor( + ov::element::u8, + ov::Shape{1, size_t(desired_channels), size_t(y), size_t(x)}, + SharedImageAllocator{image, desired_channels, y, x} + ); +} diff --git a/samples/cpp/visual_language_chat/load_image.hpp b/samples/cpp/visual_language_chat/load_image.hpp new file mode 100644 index 0000000000..f66dd2caf2 --- /dev/null +++ b/samples/cpp/visual_language_chat/load_image.hpp @@ -0,0 +1,12 @@ + +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include + +namespace utils { +ov::Tensor load_image(const std::filesystem::path& image_path); +} diff --git a/samples/cpp/visual_language_chat/visual_language_chat.cpp b/samples/cpp/visual_language_chat/visual_language_chat.cpp new file mode 100644 index 0000000000..838a1be78e --- /dev/null +++ b/samples/cpp/visual_language_chat/visual_language_chat.cpp @@ -0,0 +1,55 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "load_image.hpp" +#include +#include + +bool print_subword(std::string&& subword) { + return !(std::cout << subword << std::flush); +} + +int main(int argc, char* argv[]) try { + if (3 != argc) { + throw std::runtime_error(std::string{"Usage "} + argv[0] + " "); + } + ov::Tensor image = utils::load_image(argv[2]); + std::string device = "CPU"; // GPU can be used as well + ov::AnyMap enable_compile_cache; + if ("GPU" == device) { + // Cache compiled models on disk for GPU to save time on the + // next run. It's not beneficial for CPU. + enable_compile_cache.insert({ov::cache_dir("vlm_cache")}); + } + ov::genai::VLMPipeline pipe(argv[1], device, enable_compile_cache); + std::string prompt; + + pipe.start_chat(); + std::cout << "question:\n"; + if (!std::getline(std::cin, prompt)) { + throw std::runtime_error("std::cin failed"); + } + pipe.generate( + prompt, + ov::genai::image(std::move(image)), + ov::genai::streamer(print_subword) + ); + std::cout << "\n----------\n" + "question:\n"; + while (std::getline(std::cin, prompt)) { + pipe.generate(prompt, ov::genai::streamer(print_subword)); + std::cout << "\n----------\n" + "question:\n"; + } + pipe.finish_chat(); +} catch (const std::exception& error) { + try { + std::cerr << error.what() << '\n'; + } catch (const std::ios_base::failure&) {} + return EXIT_FAILURE; +} catch (...) { + try { + std::cerr << "Non-exception object thrown\n"; + } catch (const std::ios_base::failure&) {} + return EXIT_FAILURE; +} diff --git a/samples/requirements.txt b/samples/requirements.txt index e5ab5180f3..b8cc30895e 100644 --- a/samples/requirements.txt +++ b/samples/requirements.txt @@ -2,4 +2,5 @@ optimum[openvino]==1.22.0 einops==0.8.0 # For Qwen transformers_stream_generator==0.0.5 # For Qwen -diffusers==0.30.3 \ No newline at end of file +diffusers==0.30.3 +torchvision diff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt index 922c808ed0..20b547052c 100644 --- a/src/cpp/CMakeLists.txt +++ b/src/cpp/CMakeLists.txt @@ -51,6 +51,9 @@ file(GLOB_RECURSE SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp" "${CMAKE_ set(TARGET_NAME openvino_genai) add_library(${TARGET_NAME} SHARED ${SOURCE_FILES}) +if(TARGET openvino_tokenizers) + add_dependencies(${TARGET_NAME} openvino_tokenizers) +endif() add_library(openvino::genai ALIAS ${TARGET_NAME}) target_include_directories(${TARGET_NAME} diff --git a/src/cpp/include/openvino/genai/processor_config.hpp b/src/cpp/include/openvino/genai/processor_config.hpp new file mode 100644 index 0000000000..9a70d1f3ae --- /dev/null +++ b/src/cpp/include/openvino/genai/processor_config.hpp @@ -0,0 +1,46 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "openvino/genai/visibility.hpp" +#include +#include +#include + +namespace ov::genai { +/// @brief A Configuration class passed to VisionEncoder and used to +/// change VisionEncoder's behavior. Corresponds to +/// preprocessor_config.json. +class OPENVINO_GENAI_EXPORTS ProcessorConfig { +public: + /// @brief Dimensions of the smaller, non-overlapping patches that the + /// input image is divided into before being fed into the + /// transformer model. Used to divide image height and width. + size_t patch_size = 14; + /// @brief A recommended size to resize an input image. + /// llava calls it crop_size[height, width]. + size_t scale_resolution = 448; + /// @brief Maximum allowed number of intput image slices. + /// 0 disables slicing. + /// llava has image_grid_pinpoints instead. + size_t max_slice_nums = 0; + /// @brief RGB values to be subtracted from image pixel values. + /// Applied before norm_std. + /// llava calls it image_mean. + std::array norm_mean{0.0f, 0.0f, 0.0f}; + /// @brief RGB values to divide image pixel values. + /// Applied after norm_mean. + /// llava calls it image_std. + std::array norm_std{1.0f, 1.0f, 1.0f}; + /// @brief Default constructor + ProcessorConfig() = default; + /// @brief Construct ProcessorConfig from values in json_path. + /// Keys in the file must match the ProcessorConfig's members. + /// @param json_path A path to a file to extract the values from. + explicit ProcessorConfig(const std::filesystem::path& json_path); + /// @brief Default copy constructor. + /// @param A config to copy from. + ProcessorConfig(const ProcessorConfig&) = default; +}; +} // namespace ov::genai diff --git a/src/cpp/include/openvino/genai/vision_encoder.hpp b/src/cpp/include/openvino/genai/vision_encoder.hpp new file mode 100644 index 0000000000..7370b7f8aa --- /dev/null +++ b/src/cpp/include/openvino/genai/vision_encoder.hpp @@ -0,0 +1,121 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "openvino/genai/processor_config.hpp" +#include + +namespace ov::genai { +/// @brief A pair describing image size. +struct HeightWidth { + /// @brief Height of a corresponding image. + size_t height; + /// @brief Width of a corresponding image. + size_t width; +}; + +/// @brief Embeddings of a given image. The number of slices is no +/// greater than ProcessorConfig's max_slice_nums. +struct EncodedImage { + /// @brief Embeddings of a resized image based on ProcessorConfig's + /// scale_resolution. The tensor's shape is + /// [N, H*W, hidden_size]. [N, 1014, 1152] is a possible example for + /// openbmb/MiniCPM-V-2. Only batch 1 is supported. + ov::Tensor resized_source; + /// @brief A size of an image used to compute embeddings for + /// divided by ProcessorConfig's patch_size. + HeightWidth resized_source_size; + /// @brief Embeddings of images obtained from a source image by + /// slicing at no more than max_slice_nums pieces and resizing. + /// The tensor's shape is + /// [slice_y, slice_x, number_of_embeddings, embedding_size]. + /// slices_sizes.size() == slice_y * slice_x. + ov::Tensor slices; + /// @brief Flattened sizes of images used to compute embeddings + /// stored in slices member divided by ProcessorConfig's patch_size. + std::vector slices_sizes; +}; + +/// @brief A class used to infer embeddings of an image using +/// ov::InferRequest and configured by ProcessorConfig. +class OPENVINO_GENAI_EXPORTS VisionEncoder { +public: + /// @brief A model for image encoding. + ov::InferRequest m_encoder; + /// @brief A config to follow. + ProcessorConfig m_processor_config; + + /// @brief Construct from an already compiled model and a config. + /// @param encoder Compiled model. + /// @param processor_config Initial config. + explicit VisionEncoder( + const ov::InferRequest& encoder, + const ProcessorConfig& processor_config=ProcessorConfig{} + ) : m_encoder{encoder}, m_processor_config{processor_config} {} + + /// @brief Construct the encoder from model_dir. + /// @param model_dir A folder containing openvino_embedding.xml and + /// preprocessor_config.json. + /// @param device A device to compile the encoder for. + /// @param device_config A config to be passed to + /// ov::Core::compile_model(). + /// @param core ov::Core to be used to compile the model. + explicit VisionEncoder( + const std::filesystem::path& model_dir, + const std::string& device="CPU", + const ov::AnyMap device_config={}, + ov::Core core=ov::Core{} + ); + + /// @brief Compute embeddings of an image. + /// @param image An image to infer embeddings for. Image shape must be + /// [1CHW]. Only batch 1 is supported. + /// @return Resulting embeddings for the resized source image and + /// its slices. + EncodedImage encode(const ov::Tensor& image) { + return encode(image, m_processor_config); + } + + /// @brief Compute embeddings of an image given ProcessorConfig. + /// @param image An image to infer embeddings for. Image shape must be + /// [1CHW]. Only batch 1 is supported. + /// @param config A config to follow instead of the config obtained + /// in constructors. + /// @return Resulting embeddings for the resized source image and + /// its slices. + EncodedImage encode( + const ov::Tensor& image, const ProcessorConfig& config + ); + + /// @brief Compute embeddings of an image given + /// ProcessorConfig members. + /// @param image An image to infer embeddings for. Image shape must be + /// [1CHW]. Only batch 1 is supported. + /// @param config_map A config or its members values to follow + /// instead of the config obtained in constructors. + /// @return Resulting embeddings for the resized source image and + /// its slices. + EncodedImage encode( + const ov::Tensor& image, const ov::AnyMap& config_map + ); + + /// @brief Compute embeddings of an image given + /// ProcessorConfig members. + /// @param image An image to infer embeddings for. Image shape must be + /// [1CHW]. Only batch 1 is supported. + /// @param ...properties A config or its members values to follow + /// instead of the config obtained in constructors. + /// @return Resulting embeddings for the resized source image and + /// its slices. + template + util::EnableIfAllStringAny encode( + const ov::Tensor& image, + Properties&&... properties + ) { + return encode( + image, AnyMap{std::forward(properties)...} + ); + } +}; +} diff --git a/src/cpp/include/openvino/genai/vlm_config.hpp b/src/cpp/include/openvino/genai/vlm_config.hpp new file mode 100644 index 0000000000..dd22e422bf --- /dev/null +++ b/src/cpp/include/openvino/genai/vlm_config.hpp @@ -0,0 +1,54 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "openvino/genai/visibility.hpp" +#include +#include + +namespace ov::genai { +/// @brief A Configuration class passed to VLMPipeline and used to +/// change VLMPipeline's behavior. Corresponds to config.json. +class OPENVINO_GENAI_EXPORTS VLMConfig { +public: + /// @brief A size of a single embedding returned by a resampler. + /// Used to initialize positional embeddings for resampler input. + size_t hidden_size = 2304; + /// @brief Multiply embeddings by this value. + float scale_emb = 1.0f; + /// @brief A number of embedding vectors representing an image + /// slice. + size_t query_num = 64; + /// @brief A string token denoting start of image embeddings for an + /// LLM. + std::string im_start = ""; + /// @brief A string token denoting end of image embeddings for an + /// LLM. + std::string im_end = ""; + /// @brief A string token denoting start of image slices row + /// embeddings for an LLM. + std::string slice_start = ""; + /// @brief A string token denoting end of image slices row + /// embeddings for LLM. + std::string slice_end = ""; + /// @brief Start each image (not a slice) with + /// i. i is a number. + bool use_image_id = true; + /// @brief A string token denoting start of image number region. + std::string im_id_start = ""; + /// @brief A string token denoting end of image number region. + std::string im_id_end = ""; + /// @brief A placeholder for image embeddings in text. + std::string unk = ""; + /// @brief Default constructor. + VLMConfig() = default; + /// @brief Construct VLMConfig from values in json_path. + /// Keys in the file must match the VLMConfig's members. + /// @param json_path A path to a file to extract the values from. + explicit VLMConfig(const std::filesystem::path& config_path); + /// @brief Default copy constructor. + /// @param A config to copy from. + VLMConfig(const VLMConfig&) = default; +}; +} // namespace ov::genai diff --git a/src/cpp/include/openvino/genai/vlm_pipeline.hpp b/src/cpp/include/openvino/genai/vlm_pipeline.hpp new file mode 100644 index 0000000000..85ea9dd661 --- /dev/null +++ b/src/cpp/include/openvino/genai/vlm_pipeline.hpp @@ -0,0 +1,173 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "openvino/genai/llm_pipeline.hpp" +#include "openvino/genai/streamer_base.hpp" +#include "openvino/genai/tokenizer.hpp" +#include "openvino/genai/vision_encoder.hpp" +#include "openvino/genai/vlm_config.hpp" + +namespace ov::genai { +/// @brief A string prompt and source image. +struct PromptImages { + /// @brief A prompt represented as std::string. + std::string prompt; + /// @brief An image represented as ov::Tensor. + std::vector images; +}; + +/// @brief A Visual language modeling pipeline class used to generate a +/// response or run a chat given a prompt and an image. +class OPENVINO_GENAI_EXPORTS VLMPipeline { +public: + // A config to follow for LLM input construction. + VLMConfig m_vlm_config; + // A config to follow for text generation. + GenerationConfig m_generation_config; + // A tokenizer encoding a prompt. + Tokenizer m_tokenizer; + // An encoder to infer embeddings of an image. + VisionEncoder m_vision_encoder; + // A resampler model to resample image embeddings. + // [N, H*W, old_hidden_size] is the input shape. + // [N, query_num, hidden_size] is the output shape. + ov::InferRequest m_resampler; + // A model to compute token embeddings. + // Input shape: [N, conversation length]. + // Output shape: [1, conversation length, hidden_size]. + ov::InferRequest m_embedding; + // A language model used to generate a response. + // Input shapes: inputs_embeds[N, conversation length, hidden_size], + // position_ids[N, conversation length], beam_idx[N]. + // Output shape: logits[N, conversation length, vocab_size]. + ov::InferRequest m_language; + // Precomputed positional embeddings for the resampler. + // [70, 70, hidden_size]. 70 is the initial guess of the image + // height and width after dividing by patch_size. + ov::Tensor m_pos_embed_cache; + // True if chat mode is activated to save conversation + // history between generate() calls. + bool m_is_chat_conversation; + ChatHistory m_history; + std::string m_templated_chat_history; + size_t image_id = 0; // Used to insert i per image (not a slice). + + /// @brief Construct a pipeline form a folder containing tokenizer + /// and model IRs. + /// @param model_dir A folder to read tokenizer and model IRs. + /// @param device Inference device. A tokenizer is always compiled + /// for CPU. + /// @param device_config A config to pass to ov::Core.set_property() + /// and ov::Core::compile_model(). + /// @param core ov::Core instance to use. + explicit VLMPipeline( + const std::filesystem::path& model_dir, + const std::string& device="CPU", + const ov::AnyMap device_config={}, + ov::Core core=ov::Core{} + ) : VLMPipeline{ + model_dir, + Tokenizer(model_dir.string(), device_config), + device, + device_config, + core + } {} + + /// @brief Construct a pipeline form a folder containing model IRs + /// and from a Tokenizer instance. + /// @param model_dir A folder to read model IRs. + /// @param tokenizer An instance of Tokenizer to use. + /// @param device Inference device. + /// @param device_config A config to pass to ov::Core.set_property() + /// and ov::Core::compile_model(). + /// @param core ov::Core instance to use. + VLMPipeline( + const std::filesystem::path& model_dir, + const ov::genai::Tokenizer& tokenizer, + const std::string& device="CPU", + const ov::AnyMap device_config={}, + ov::Core core=ov::Core{} + ); + + /// @brief Default destructor. + ~VLMPipeline(); + + /// @brief Generate a response given a prompt and any number of + /// uint8 RGB images. + /// @param prompt A prompt to respond to. + /// @param images Images to be prepended to a prompt. + /// @param generation_config A config to follow for text generation. + /// @param streamer A streamer to acquire intermidiate result. + /// @return A string generated by a model. + DecodedResults generate( + const std::string& prompt, + const std::vector& rgbs, + const GenerationConfig& generation_config, + const StreamerVariant& streamer + ); + /// @brief Generate a response given a prompt and config. + /// @param prompt A prompt to respond to. + /// @param config_map A config may contain GenerationConfig, values + /// for its members, StreamerVariant a single image or multiple + /// images. + /// @return A string generated by a model. + DecodedResults generate( + const std::string& prompt, + const ov::AnyMap& config_map + ); + /// @brief Generate a response given a prompt and arbitrary number + /// of ov::Property instances. + /// Example: + /// generate("text", image(std::move(rgb)), do_sample(true)); + /// @param prompt A prompt to respond to. + /// @param ...properties ov::Property instances to be combined into + /// ov::AnyMap. + /// @return A string generated by a model. + template + util::EnableIfAllStringAny generate( + const std::string& prompt, + Properties&&... properties + ) { + return generate( + prompt, AnyMap{std::forward(properties)...} + ); + } + /// @brief Activate chat mode. Chat preserves previous history and + /// applies chat_template to input prompts. Calling start_chat() + /// again or finish_chat() drops the memorized history. + /// It's possible to disable + /// chat_template application by calling + /// set_chat_template("{% for message in messages %}{{ message['content'] }}{% endfor %}") + /// @param system_message Some chat_templates contain system role + /// in addition to user and assistant roles. Set a message for that + /// role. + void start_chat(const std::string& system_message=""); + /// @brief Deactivate chat mode. + void finish_chat() {m_is_chat_conversation = false;} + /// @brief Set a custom chat template. Can be used to deactivate + /// chat_template application for chat mode if called with + /// "{% for message in messages %}{{ message['content'] }}{% endfor %}" + /// or workaround unsupported chat_template entries in a default + /// model chat_template. + /// @param new_template A new template to override with. + void set_chat_template(const std::string& new_template); + /// @brief Extract GenerationConfig used to get default values. + /// @return Default values used. + GenerationConfig get_generation_config() const; + /// @brief Override default values for GenerationConfig + /// @param new_config A config to override default values with. + void set_generation_config(const GenerationConfig& new_config); +private: + class VLMPipelineImpl; + std::unique_ptr m_pimpl; +}; + +/* + * utils that allow to use generate() in the following way: + * pipe.generate(prompt, ov::genai::image(std::move(image_tensor))). +*/ +static constexpr ov::Property image{"image"}; +static constexpr ov::Property> images{"images"}; +} diff --git a/src/cpp/src/clip.cpp b/src/cpp/src/clip.cpp new file mode 100644 index 0000000000..bb416519bb --- /dev/null +++ b/src/cpp/src/clip.cpp @@ -0,0 +1,319 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +// NOTE: This is modified from clip.cpp only for LLaVA, +// so there might be still unnecessary artifacts hanging around +// I'll gradually clean and extend it +// Note: Even when using identical normalized image inputs (see normalize_image_u8_to_f32()) we have a significant difference in resulting embeddings compared to pytorch + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "clip.hpp" + +#include + +struct clip_hparams { + int32_t image_size; + int32_t hidden_size; + int32_t n_intermediate; + int32_t projection_dim; + int32_t n_head; + int32_t n_layer; + + float eps; + + char mm_patch_merge_type[32] = "flat"; // spatial_unpad or flat (default) + + int32_t image_grid_pinpoints[32]; + int32_t image_crop_resolution; +}; + +// Linear interpolation between two points +inline float clip_lerp(float s, float e, float t) { + return s + (e - s) * t; +} +// Bilinear resize function +static void bilinear_resize(const clip_image_u8& src, clip_image_u8& dst, int target_width, int target_height) { + dst.nx = target_width; + dst.ny = target_height; + dst.buf.resize(3 * target_width * target_height); + + float x_ratio = static_cast(src.nx - 1) / target_width; + float y_ratio = static_cast(src.ny - 1) / target_height; + + for (int y = 0; y < target_height; y++) { + for (int x = 0; x < target_width; x++) { + float px = x_ratio * x; + float py = y_ratio * y; + int x_floor = static_cast(px); + int y_floor = static_cast(py); + float x_lerp = px - x_floor; + float y_lerp = py - y_floor; + + for (int c = 0; c < 3; c++) { + float top = clip_lerp( + static_cast(src.buf[3 * (y_floor * src.nx + x_floor) + c]), + static_cast(src.buf[3 * (y_floor * src.nx + (x_floor + 1)) + c]), + x_lerp + ); + float bottom = clip_lerp( + static_cast(src.buf[3 * ((y_floor + 1) * src.nx + x_floor) + c]), + static_cast(src.buf[3 * ((y_floor + 1) * src.nx + (x_floor + 1)) + c]), + x_lerp + ); + dst.buf[3 * (y * target_width + x) + c] = static_cast(clip_lerp(top, bottom, y_lerp)); + } + } + } +} + +// Normalize image to float32 - careful with pytorch .to(model.device, dtype=torch.float16) - this sometimes reduces precision (32>16>32), sometimes not +static void normalize_image_u8_to_f32(const clip_image_u8* src, clip_image_f32* dst, const float mean[3], const float std[3]) { + dst->nx = src->nx; + dst->ny = src->ny; + dst->buf.resize(src->buf.size()); + + for (size_t i = 0; i < src->buf.size(); ++i) { + int c = i % 3; // rgb + dst->buf[i] = (static_cast(src->buf[i]) / 255.0f - mean[c]) / std[c]; + } +} + +template +NUM clip(NUM x, NUM lower, NUM upper) { + return std::max(lower, std::min(x, upper)); +} + +bool bicubic_resize(const clip_image_u8 &img, clip_image_u8 &dst, int target_width, int target_height) { + const int nx = img.nx; + const int ny = img.ny; + + dst.nx = target_width; + dst.ny = target_height; + dst.buf.resize(3 * target_width * target_height); + + float Cc; + float C[5]; + float d0, d2, d3, a0, a1, a2, a3; + int i, j, k, jj; + int x, y; + float dx, dy; + float tx, ty; + + tx = (float)nx / (float)target_width; + ty = (float)ny / (float)target_height; + + // Bicubic interpolation; adapted from ViT.cpp, inspired from : + // -> https://github.com/yglukhov/bicubic-interpolation-image-processing/blob/master/libimage.c#L36 + // -> https://en.wikipedia.org/wiki/Bicubic_interpolation + + for (i = 0; i < target_height; i++) { + for (j = 0; j < target_width; j++) { + x = (int)(tx * j); + y = (int)(ty * i); + + dx = tx * j - x; + dy = ty * i - y; + + for (k = 0; k < 3; k++) { + for (jj = 0; jj <= 3; jj++) { + d0 = img.buf[(clip(y - 1 + jj, 0, ny - 1) * nx + clip(x - 1, 0, nx - 1)) * 3 + k] - img.buf[(clip(y - 1 + jj, 0, ny - 1) * nx + clip(x, 0, nx - 1)) * 3 + k]; + d2 = img.buf[(clip(y - 1 + jj, 0, ny - 1) * nx + clip(x + 1, 0, nx - 1)) * 3 + k] - img.buf[(clip(y - 1 + jj, 0, ny - 1) * nx + clip(x, 0, nx - 1)) * 3 + k]; + d3 = img.buf[(clip(y - 1 + jj, 0, ny - 1) * nx + clip(x + 2, 0, nx - 1)) * 3 + k] - img.buf[(clip(y - 1 + jj, 0, ny - 1) * nx + clip(x, 0, nx - 1)) * 3 + k]; + a0 = img.buf[(clip(y - 1 + jj, 0, ny - 1) * nx + clip(x, 0, nx - 1)) * 3 + k]; + + a1 = -1.0 / 3 * d0 + d2 - 1.0 / 6 * d3; + a2 = 1.0 / 2 * d0 + 1.0 / 2 * d2; + a3 = -1.0 / 6 * d0 - 1.0 / 2 * d2 + 1.0 / 6 * d3; + + C[jj] = a0 + a1 * dx + a2 * dx * dx + a3 * dx * dx * dx; + + d0 = C[0] - C[1]; + d2 = C[2] - C[1]; + d3 = C[3] - C[1]; + a0 = C[1]; + a1 = -1.0 / 3 * d0 + d2 - 1.0 / 6 * d3; + a2 = 1.0 / 2 * d0 + 1.0 / 2 * d2; + a3 = -1.0 / 6 * d0 - 1.0 / 2 * d2 + 1.0 / 6 * d3; + Cc = a0 + a1 * dy + a2 * dy * dy + a3 * dy * dy * dy; + + const uint8_t Cc2 = std::min(std::max(std::round(Cc), 0.0f), 255.0f); + dst.buf[(i * target_width + j) * 3 + k] = float(Cc2); + } + } + } + } + + return true; +} + +// llava-1.6 type of resize_and_pad (black) +static void resize_and_pad_image(const clip_image_u8& image, clip_image_u8 &image_output, const std::pair& target_resolution) { + int target_width = target_resolution.first; + int target_height = target_resolution.second; + + float scale_w = static_cast(target_width) / image.nx; + float scale_h = static_cast(target_height) / image.ny; + + int new_width, new_height; + + if (scale_w < scale_h) { + new_width = target_width; + new_height = std::min(static_cast(std::ceil(image.ny * scale_w)), target_height); + } else { + new_height = target_height; + new_width = std::min(static_cast(std::ceil(image.nx * scale_h)), target_width); + } + + clip_image_u8 resized_image; + // bilinear_resize(image, resized_image, new_width, new_height); + bicubic_resize(image, resized_image, new_width, new_height); + + clip_image_u8 padded_image; + padded_image.nx = target_width; + padded_image.ny = target_height; + padded_image.buf.resize(3 * target_width * target_height, 0); // Initialize with black + + // Calculate padding offsets + int pad_x = (target_width - new_width) / 2; + int pad_y = (target_height - new_height) / 2; + + // Copy the resized image into the center of the padded buffer + for (int y = 0; y < new_height; ++y) { + for (int x = 0; x < new_width; ++x) { + for (int c = 0; c < 3; ++c) { + padded_image.buf[3 * ((y + pad_y) * target_width + (x + pad_x)) + c] = resized_image.buf[3 * (y * new_width + x) + c]; + } + } + } + image_output = std::move(padded_image); +} + +/** + * Selects the best resolution from a list of possible resolutions based on the original size. + * + * @param original_size The original size of the image in the format (width, height). + * @param possible_resolutions A list of possible resolutions in the format [(width1, height1), (width2, height2), ...]. + * @return The best fit resolution in the format (width, height). + */ +static std::pair select_best_resolution(const std::pair & original_size, const std::vector> & possible_resolutions) { + int original_width = original_size.first; + int original_height = original_size.second; + std::pair best_fit; + int max_effective_resolution = 0; + int min_wasted_resolution = std::numeric_limits::max(); + + for (const auto& resolution : possible_resolutions) { + int width = resolution.first; + int height = resolution.second; + float scale = std::min(static_cast(width) / original_width, static_cast(height) / original_height); + int downscaled_width = static_cast(original_width * scale); + int downscaled_height = static_cast(original_height * scale); + int effective_resolution = std::min(downscaled_width * downscaled_height, original_width * original_height); + int wasted_resolution = (width * height) - effective_resolution; + // LOG_TEE("resolution: %d %d, scale: %f, downscaled: %d %d, effective: %d, wasted: %d\n", width, height, scale, downscaled_width, downscaled_height, effective_resolution, wasted_resolution); + if (effective_resolution > max_effective_resolution || (effective_resolution == max_effective_resolution && wasted_resolution < min_wasted_resolution)) { + max_effective_resolution = effective_resolution; + min_wasted_resolution = wasted_resolution; + best_fit = resolution; + } + } + + return best_fit; +} + +// returns the normalized float tensor for llava-1.5, for spatial_unpad with anyres processing for llava-1.6 it returns the normalized image patch tensors as a vector +// res_imgs memory is being allocated here, previous allocations will be freed if found +clip_image_f32 clip_image_preprocess(clip_ctx& ctx, const clip_image_u8& img) { + bool pad_to_square = true; + + // the logic below is to pad the shorter side to the longer side with a background color: rgb(122, 116, 104) + // see https://github.com/haotian-liu/LLaVA/blob/e854a2bf85118c504f6f16bf5c3c7c92f8fa8c6b/llava/conversation.py#L113-L156 + + clip_image_u8 temp; // we will keep the input image data here temporarily + temp.nx = img.nx; + temp.ny = img.ny; + temp.buf.resize(img.buf.size()); + memcpy(temp.buf.data(), img.buf.data(), temp.buf.size()); + + + const int nx = temp.nx; + const int ny = temp.ny; + // clip_image_save_to_bmp(*temp, "resized_vanilla.bmp"); + + const int nx2 = temp.nx; + const int ny2 = temp.ny; + + clip_image_f32 res; + res.nx = nx2; + res.ny = ny2; + res.buf.resize(3 * nx2 * ny2); + + // const float scale = std::max(nx, ny) / (float)ctx.vision_model.hparams.image_size; + + // const int nx3 = int(nx / scale + 0.5f); + // const int ny3 = int(ny / scale + 0.5f); + + const int nx3 = nx; + const int ny3 = ny; + + const auto& m3 = ctx.image_mean; // {0.48145466f, 0.4578275f, 0.40821073f}; + const auto& s3 = ctx.image_std; // {0.26862954f, 0.26130258f, 0.27577711f}; + + for (int y = 0; y < ny3; y++) { + for (int x = 0; x < nx3; x++) { + for (int c = 0; c < 3; c++) { + // linear interpolation + const float sx = x; + const float sy = y; + + const int x0 = std::max(0, (int)std::floor(sx)); + const int y0 = std::max(0, (int)std::floor(sy)); + + const int x1 = std::min(x0 + 1, nx - 1); + const int y1 = std::min(y0 + 1, ny - 1); + + const float dx = sx - x0; + const float dy = sy - y0; + + const int j00 = 3 * (y0 * nx + x0) + c; + const int j01 = 3 * (y0 * nx + x1) + c; + const int j10 = 3 * (y1 * nx + x0) + c; + const int j11 = 3 * (y1 * nx + x1) + c; + + const float v00 = temp.buf[j00]; + const float v01 = temp.buf[j01]; + const float v10 = temp.buf[j10]; + const float v11 = temp.buf[j11]; + + const float v0 = v00 * (1.0f - dx) + v01 * dx; + const float v1 = v10 * (1.0f - dx) + v11 * dx; + + const float v = v0 * (1.0f - dy) + v1 * dy; + + const uint8_t v2 = std::min(std::max(std::round(v), 0.0f), 255.0f); + + //rgb hwc ->chw + //const int i = 3 * (y * nx3 + x) + c; + const int i = (y * nx3 + x) + c * nx3 * ny3; + + res.buf[i] = ((float(v2) / 255.0f) - m3[c]) / s3[c]; + } + } + } + return res; +} diff --git a/src/cpp/src/clip.hpp b/src/cpp/src/clip.hpp new file mode 100644 index 0000000000..c8965a4890 --- /dev/null +++ b/src/cpp/src/clip.hpp @@ -0,0 +1,54 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#ifndef CLIP_H +#define CLIP_H + +#include +#include + +//#define CLIP_DEBUG_FUNCTIONS +enum projector_type { + PROJECTOR_TYPE_RESAMPLER, + PROJECTOR_TYPE_UNKNOWN, +}; + +struct clip_ctx { + bool has_text_encoder = false; + bool has_vision_encoder = false; + bool has_minicpmv_projector = false; + + float image_mean[3]; + float image_std[3]; + int32_t ftype = 1; + + std::vector buf_compute_meta; + + projector_type proj_type = PROJECTOR_TYPE_RESAMPLER; +}; + +// RGB uint8 image +struct clip_image_u8 { + int nx; + int ny; + + std::vector buf; +}; + +// RGB float32 image (NHWC) +// Memory layout: RGBRGBRGB... +struct clip_image_f32 { + int nx; + int ny; + + std::vector buf; +}; + +/** interpret bytes as an image file with length bytes_length, and use the result to populate img */ +bool clip_image_load_from_bytes(const unsigned char * bytes, size_t bytes_length, struct clip_image_u8 * img); + +bool bicubic_resize(const clip_image_u8& img, clip_image_u8& dst, int target_width, int target_height); + +/** preprocess img and store the result in res_imgs, pad_to_square may be overriden to false depending on model configuration */ +clip_image_f32 clip_image_preprocess(struct clip_ctx& ctx, const clip_image_u8& img); +#endif // CLIP_H diff --git a/src/cpp/src/processor_config.cpp b/src/cpp/src/processor_config.cpp new file mode 100644 index 0000000000..33673f7e79 --- /dev/null +++ b/src/cpp/src/processor_config.cpp @@ -0,0 +1,22 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "openvino/genai/processor_config.hpp" +#include "utils.hpp" +#include + +ov::genai::ProcessorConfig::ProcessorConfig(const std::filesystem::path& json_path) { + std::ifstream stream(json_path); + OPENVINO_ASSERT(stream.is_open(), "Failed to open '" + json_path.string() + "' with processor config"); + nlohmann::json parsed = nlohmann::json::parse(stream); + using ov::genai::utils::read_json_param; + read_json_param(parsed, "patch_size", patch_size); + read_json_param(parsed, "scale_resolution", scale_resolution); + read_json_param(parsed, "max_slice_nums", max_slice_nums); + if (parsed.contains("norm_mean")) { + norm_mean = parsed.at("norm_mean").get>(); + } + if (parsed.contains("norm_std")) { + norm_std = parsed.at("norm_std").get>(); + } +} diff --git a/src/cpp/src/stb_image.hpp b/src/cpp/src/stb_image.hpp new file mode 100644 index 0000000000..4766d7e675 --- /dev/null +++ b/src/cpp/src/stb_image.hpp @@ -0,0 +1,8396 @@ +/* stb_image - v2.28 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum { + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct { + int (*read)(void * user, char * data, + int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip)(void * user, int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof)(void * user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, + int desired_channels); +STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, + int * channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc * stbi_load(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); +STBIDEF stbi_uc * stbi_load_from_file(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const * buffer, int len, int ** delays, int * x, int * y, int * z, + int * comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char * buffer, size_t bufferlen, const wchar_t * input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, + int desired_channels); +STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, + int * channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us * stbi_load_16(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); +STBIDEF stbi_us * stbi_load_from_file_16(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR +STBIDEF float * stbi_loadf_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, + int desired_channels); +STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * channels_in_file, + int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF float * stbi_loadf(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); +STBIDEF float * stbi_loadf_from_file(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); +#endif +#endif + +#ifndef STBI_NO_HDR +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); +STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); +STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const * clbk, void * user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const * buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr(char const * filename); +STBIDEF int stbi_is_hdr_from_file(FILE * f); +#endif // STBI_NO_STDIO + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char * stbi_failure_reason(void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free(void * retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const * buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const * clbk, void * user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const * filename, int * x, int * y, int * comp); +STBIDEF int stbi_info_from_file(FILE * f, int * x, int * y, int * comp); +STBIDEF int stbi_is_16_bit(char const * filename); +STBIDEF int stbi_is_16_bit_from_file(FILE * f); +#endif + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int * outlen); +STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char * buffer, int len, int initial_size, int * outlen, + int parse_header); +STBIDEF char * stbi_zlib_decode_malloc(const char * buffer, int len, int * outlen); +STBIDEF int stbi_zlib_decode_buffer(char * obuffer, int olen, const char * ibuffer, int ilen); + +STBIDEF char * stbi_zlib_decode_noheader_malloc(const char * buffer, int len, int * outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char * obuffer, int olen, const char * ibuffer, int ilen); + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) || defined(STBI_ONLY_TGA) || \ + defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || \ + defined(STBI_ONLY_PNM) || defined(STBI_ONLY_ZLIB) +#ifndef STBI_ONLY_JPEG +#define STBI_NO_JPEG +#endif +#ifndef STBI_ONLY_PNG +#define STBI_NO_PNG +#endif +#ifndef STBI_ONLY_BMP +#define STBI_NO_BMP +#endif +#ifndef STBI_ONLY_PSD +#define STBI_NO_PSD +#endif +#ifndef STBI_ONLY_TGA +#define STBI_NO_TGA +#endif +#ifndef STBI_ONLY_GIF +#define STBI_NO_GIF +#endif +#ifndef STBI_ONLY_HDR +#define STBI_NO_HDR +#endif +#ifndef STBI_ONLY_PIC +#define STBI_NO_PIC +#endif +#ifndef STBI_ONLY_PNM +#define STBI_NO_PNM +#endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + +#include +#include +#include // ptrdiff_t on osx +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + +#ifndef _MSC_VER +#ifdef __cplusplus +#define stbi_inline inline +#else +#define stbi_inline +#endif +#else +#define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS +#if defined(__cplusplus) && __cplusplus >= 201103L +#define STBI_THREAD_LOCAL thread_local +#elif defined(__GNUC__) && __GNUC__ < 5 +#define STBI_THREAD_LOCAL __thread +#elif defined(_MSC_VER) +#define STBI_THREAD_LOCAL __declspec(thread) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) +#define STBI_THREAD_LOCAL _Thread_local +#endif + +#ifndef STBI_THREAD_LOCAL +#if defined(__GNUC__) +#define STBI_THREAD_LOCAL __thread +#endif +#endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32) == 4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL +#define stbi_lrot(x, y) _lrotl(x, y) +#else +#define stbi_lrot(x, y) (((x) << (y)) | ((x) >> (-(y)&31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p, newsz) realloc(p, newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p, oldsz, newsz) STBI_REALLOC(p, newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) { + int info[4]; + __cpuid(info, 1); + return info[3]; +} +#else +static int stbi__cpuid3(void) { + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) { + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) { + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct { + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void * io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + +static void stbi__refill_buffer(stbi__context * s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context * s, stbi_uc const * buffer, int len) { + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *)buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *)buffer + len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context * s, stbi_io_callbacks * c, void * user) { + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void * user, char * data, int size) { return (int)fread(data, 1, size, (FILE *)user); } + +static void stbi__stdio_skip(void * user, int n) { + int ch; + fseek((FILE *)user, n, SEEK_CUR); + ch = fgetc((FILE *)user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *)user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void * user) { return feof((FILE *)user) || ferror((FILE *)user); } + +static stbi_io_callbacks stbi__stdio_callbacks = { + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context * s, FILE * f) { stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *)f); } + +// static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context * s) { + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum { STBI_ORDER_RGB, STBI_ORDER_BGR }; + +typedef struct { + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context * s); +static void * stbi__jpeg_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static int stbi__jpeg_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context * s); +static void * stbi__png_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static int stbi__png_info(stbi__context * s, int * x, int * y, int * comp); +static int stbi__png_is16(stbi__context * s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context * s); +static void * stbi__bmp_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static int stbi__bmp_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context * s); +static void * stbi__tga_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static int stbi__tga_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context * s); +static void * stbi__psd_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, int bpc); +static int stbi__psd_info(stbi__context * s, int * x, int * y, int * comp); +static int stbi__psd_is16(stbi__context * s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context * s); +static float * stbi__hdr_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static int stbi__hdr_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context * s); +static void * stbi__pic_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static int stbi__pic_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context * s); +static void * stbi__gif_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static void * stbi__load_gif_main(stbi__context * s, int ** delays, int * x, int * y, int * z, int * comp, int req_comp); +static int stbi__gif_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context * s); +static void * stbi__pnm_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static int stbi__pnm_info(stbi__context * s, int * x, int * y, int * comp); +static int stbi__pnm_is16(stbi__context * s); +#endif + +static +#ifdef STBI_THREAD_LOCAL + STBI_THREAD_LOCAL +#endif + const char * stbi__g_failure_reason; + +STBIDEF const char * stbi_failure_reason(void) { return stbi__g_failure_reason; } + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char * str) { + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void * stbi__malloc(size_t size) { return STBI_MALLOC(size); } + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) { + if (b < 0) + return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) { + if (a < 0 || b < 0) + return 0; + if (b == 0) + return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX / b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) { + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a * b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) { + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) && stbi__addsizes_valid(a * b * c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) { + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) && stbi__mul2sizes_valid(a * b * c, d) && + stbi__addsizes_valid(a * b * c * d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void * stbi__malloc_mad2(int a, int b, int add) { + if (!stbi__mad2sizes_valid(a, b, add)) + return NULL; + return stbi__malloc(a * b + add); +} +#endif + +static void * stbi__malloc_mad3(int a, int b, int c, int add) { + if (!stbi__mad3sizes_valid(a, b, c, add)) + return NULL; + return stbi__malloc(a * b * c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void * stbi__malloc_mad4(int a, int b, int c, int d, int add) { + if (!stbi__mad4sizes_valid(a, b, c, d, add)) + return NULL; + return stbi__malloc(a * b * c * d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) { + if ((a >= 0) != (b >= 0)) + return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) + return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two signed shorts is valid, 0 on overflow. +static int stbi__mul2shorts_valid(short a, short b) { + if (b == 0 || b == -1) + return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) + return a <= SHRT_MAX / b; // product is positive, so similar to mul2sizes_valid + if (b < 0) + return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS +#define stbi__err(x, y) 0 +#elif defined(STBI_FAILURE_USERMSG) +#define stbi__err(x, y) stbi__err(y) +#else +#define stbi__err(x, y) stbi__err(x) +#endif + +#define stbi__errpf(x, y) ((float *)(size_t)(stbi__err(x, y) ? NULL : NULL)) +#define stbi__errpuc(x, y) ((unsigned char *)(size_t)(stbi__err(x, y) ? NULL : NULL)) + +STBIDEF void stbi_image_free(void * retval_from_stbi_load) { STBI_FREE(retval_from_stbi_load); } + +#ifndef STBI_NO_LINEAR +static float * stbi__ldr_to_hdr(stbi_uc * data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc * stbi__hdr_to_ldr(float * data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) { + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) { + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load \ + (stbi__vertically_flip_on_load_set ? stbi__vertically_flip_on_load_local : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void * stbi__load_main(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, int bpc) { + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + +// test the formats with a very explicit header first (at least a FOURCC +// or distinctive magic number first) +#ifndef STBI_NO_PNG + if (stbi__png_test(s)) + return stbi__png_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) + return stbi__bmp_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_GIF + if (stbi__gif_test(s)) + return stbi__gif_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_PSD + if (stbi__psd_test(s)) + return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc); +#else + STBI_NOTUSED(bpc); +#endif +#ifndef STBI_NO_PIC + if (stbi__pic_test(s)) + return stbi__pic_load(s, x, y, comp, req_comp, ri); +#endif + +// then the formats that can end up attempting to load with just 1 or 2 +// bytes matching expectations; these are prone to false positives, so +// try them later +#ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) + return stbi__jpeg_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) + return stbi__pnm_load(s, x, y, comp, req_comp, ri); +#endif + +#ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float * hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } +#endif + +#ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s, x, y, comp, req_comp, ri); +#endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc * stbi__convert_16_to_8(stbi__uint16 * orig, int w, int h, int channels) { + int i; + int img_len = w * h * channels; + stbi_uc * reduced; + + reduced = (stbi_uc *)stbi__malloc(img_len); + if (reduced == NULL) + return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 * stbi__convert_8_to_16(stbi_uc * orig, int w, int h, int channels) { + int i; + int img_len = w * h * channels; + stbi__uint16 * enlarged; + + enlarged = (stbi__uint16 *)stbi__malloc(img_len * 2); + if (enlarged == NULL) + return (stbi__uint16 *)stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void * image, int w, int h, int bytes_per_pixel) { + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc * bytes = (stbi_uc *)image; + + for (row = 0; row < (h >> 1); row++) { + stbi_uc * row0 = bytes + row * bytes_per_row; + stbi_uc * row1 = bytes + (h - row - 1) * bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void * image, int w, int h, int z, int bytes_per_pixel) { + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc * bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char * stbi__load_and_postprocess_8bit(stbi__context * s, int * x, int * y, int * comp, int req_comp) { + stbi__result_info ri; + void * result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *)result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *)result; +} + +static stbi__uint16 * stbi__load_and_postprocess_16bit(stbi__context * s, int * x, int * y, int * comp, int req_comp) { + stbi__result_info ri; + void * result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *)result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *)result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float * result, int * x, int * y, int * comp, int req_comp) { + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char * str, + int cbmb, wchar_t * widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, + const wchar_t * widestr, int cchwide, char * str, int cbmb, + const char * defchar, int * used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char * buffer, size_t bufferlen, const wchar_t * input) { + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int)bufferlen, NULL, NULL); +} +#endif + +static FILE * stbi__fopen(char const * filename, char const * mode) { + FILE * f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename) / sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode) / sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f = 0; +#else + f = fopen(filename, mode); +#endif + return f; +} + +STBIDEF stbi_uc * stbi_load(char const * filename, int * x, int * y, int * comp, int req_comp) { + FILE * f = stbi__fopen(filename, "rb"); + unsigned char * result; + if (!f) + return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f, x, y, comp, req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc * stbi_load_from_file(FILE * f, int * x, int * y, int * comp, int req_comp) { + unsigned char * result; + stbi__context s; + stbi__start_file(&s, f); + result = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, -(int)(s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 * stbi_load_from_file_16(FILE * f, int * x, int * y, int * comp, int req_comp) { + stbi__uint16 * result; + stbi__context s; + stbi__start_file(&s, f); + result = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, -(int)(s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us * stbi_load_16(char const * filename, int * x, int * y, int * comp, int req_comp) { + FILE * f = stbi__fopen(filename, "rb"); + stbi__uint16 * result; + if (!f) + return (stbi_us *)stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f, x, y, comp, req_comp); + fclose(f); + return result; +} + +#endif //! STBI_NO_STDIO + +STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, + int desired_channels) { + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels); +} + +STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, + int * channels_in_file, int desired_channels) { + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels); +} + +STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp, int req_comp) { + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); +} + +STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp, + int req_comp) { + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const * buffer, int len, int ** delays, int * x, int * y, int * z, + int * comp, int req_comp) { + unsigned char * result; + stbi__context s; + stbi__start_mem(&s, buffer, len); + + result = (unsigned char *)stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices(result, *x, *y, *z, *comp); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float * stbi__loadf_main(stbi__context * s, int * x, int * y, int * comp, int req_comp) { + unsigned char * data; +#ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float * hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data, x, y, comp, req_comp); + return hdr_data; + } +#endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float * stbi_loadf_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp, int req_comp) { + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__loadf_main(&s, x, y, comp, req_comp); +} + +STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp, + int req_comp) { + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__loadf_main(&s, x, y, comp, req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float * stbi_loadf(char const * filename, int * x, int * y, int * comp, int req_comp) { + float * result; + FILE * f = stbi__fopen(filename, "rb"); + if (!f) + return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f, x, y, comp, req_comp); + fclose(f); + return result; +} + +STBIDEF float * stbi_loadf_from_file(FILE * f, int * x, int * y, int * comp, int req_comp) { + stbi__context s; + stbi__start_file(&s, f); + return stbi__loadf_main(&s, x, y, comp, req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const * buffer, int len) { +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__hdr_test(&s); +#else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; +#endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr(char const * filename) { + FILE * f = stbi__fopen(filename, "rb"); + int result = 0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE * f) { +#ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s, f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; +#else + STBI_NOTUSED(f); + return 0; +#endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const * clbk, void * user) { +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__hdr_test(&s); +#else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; +#endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1 / gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1 / scale; } + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum { STBI__SCAN_load = 0, STBI__SCAN_type, STBI__SCAN_header }; + +static void stbi__refill_buffer(stbi__context * s) { + int n = (s->io.read)(s->io_user_data, (char *)s->buffer_start, s->buflen); + s->callback_already_read += (int)(s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + 1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context * s) { + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context * s) { + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) + return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) + return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && \ + defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context * s, int n) { + if (n == 0) + return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int)(s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context * s, stbi_uc * buffer, int n) { + if (s->io.read) { + int blen = (int)(s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char *)buffer + blen, n - blen); + res = (count == (n - blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer + n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context * s) { + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context * s) { + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context * s) { + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context * s) { + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc)((x)&255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && \ + defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) { return (stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8); } +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && \ + defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char * stbi__convert_format(unsigned char * data, int img_n, int req_comp, unsigned int x, unsigned int y) { + int i, j; + unsigned char * good; + + if (req_comp == img_n) + return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *)stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j = 0; j < (int)y; ++j) { + unsigned char * src = data + j * x * img_n; + unsigned char * dest = good + j * x * req_comp; + +#define STBI__COMBO(a, b) ((a)*8 + (b)) +#define STBI__CASE(a, b) \ + case STBI__COMBO(a, b): \ + for (i = x - 1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1, 2) { + dest[0] = src[0]; + dest[1] = 255; + } + break; + STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; } + break; + STBI__CASE(1, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = 255; + } + break; + STBI__CASE(2, 1) { dest[0] = src[0]; } + break; + STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; } + break; + STBI__CASE(2, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = src[1]; + } + break; + STBI__CASE(3, 4) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + dest[3] = 255; + } + break; + STBI__CASE(3, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); } + break; + STBI__CASE(3, 2) { + dest[0] = stbi__compute_y(src[0], src[1], src[2]); + dest[1] = 255; + } + break; + STBI__CASE(4, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); } + break; + STBI__CASE(4, 2) { + dest[0] = stbi__compute_y(src[0], src[1], src[2]); + dest[1] = src[3]; + } + break; + STBI__CASE(4, 3) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + break; + default: + STBI_ASSERT(0); + STBI_FREE(data); + STBI_FREE(good); + return stbi__errpuc("unsupported", "Unsupported format conversion"); + } +#undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) { return (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8); } +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 * stbi__convert_format16(stbi__uint16 * data, int img_n, int req_comp, unsigned int x, unsigned int y) { + int i, j; + stbi__uint16 * good; + + if (req_comp == img_n) + return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *)stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *)stbi__errpuc("outofmem", "Out of memory"); + } + + for (j = 0; j < (int)y; ++j) { + stbi__uint16 * src = data + j * x * img_n; + stbi__uint16 * dest = good + j * x * req_comp; + +#define STBI__COMBO(a, b) ((a)*8 + (b)) +#define STBI__CASE(a, b) \ + case STBI__COMBO(a, b): \ + for (i = x - 1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1, 2) { + dest[0] = src[0]; + dest[1] = 0xffff; + } + break; + STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; } + break; + STBI__CASE(1, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = 0xffff; + } + break; + STBI__CASE(2, 1) { dest[0] = src[0]; } + break; + STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; } + break; + STBI__CASE(2, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = src[1]; + } + break; + STBI__CASE(3, 4) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + dest[3] = 0xffff; + } + break; + STBI__CASE(3, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); } + break; + STBI__CASE(3, 2) { + dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); + dest[1] = 0xffff; + } + break; + STBI__CASE(4, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); } + break; + STBI__CASE(4, 2) { + dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); + dest[1] = src[3]; + } + break; + STBI__CASE(4, 3) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + break; + default: + STBI_ASSERT(0); + STBI_FREE(data); + STBI_FREE(good); + return (stbi__uint16 *)stbi__errpuc("unsupported", "Unsupported format conversion"); + } +#undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float * stbi__ldr_to_hdr(stbi_uc * data, int x, int y, int comp) { + int i, k, n; + float * output; + if (!data) + return NULL; + output = (float *)stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { + STBI_FREE(data); + return stbi__errpf("outofmem", "Out of memory"); + } + // compute number of non-alpha components + if (comp & 1) + n = comp; + else + n = comp - 1; + for (i = 0; i < x * y; ++i) { + for (k = 0; k < n; ++k) { + output[i * comp + k] = (float)(pow(data[i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i = 0; i < x * y; ++i) { + output[i * comp + n] = data[i * comp + n] / 255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int)(x)) +static stbi_uc * stbi__hdr_to_ldr(float * data, int x, int y, int comp) { + int i, k, n; + stbi_uc * output; + if (!data) + return NULL; + output = (stbi_uc *)stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + // compute number of non-alpha components + if (comp & 1) + n = comp; + else + n = comp - 1; + for (i = 0; i < x * y; ++i) { + for (k = 0; k < n; ++k) { + float z = (float)pow(data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) + z = 0; + if (z > 255) + z = 255; + output[i * comp + k] = (stbi_uc)stbi__float2int(z); + } + if (k < comp) { + float z = data[i * comp + k] * 255 + 0.5f; + if (z < 0) + z = 0; + if (z > 255) + z = 255; + output[i * comp + k] = (stbi_uc)stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct { + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct { + stbi__context * s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + + // sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + + // definition of jpeg image component + struct { + int id; + int h, v; + int tq; + int hd, ha; + int dc_pred; + + int x, y, w2, h2; + stbi_uc * data; + void *raw_data, *raw_coeff; + stbi_uc * linebuf; + short * coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + + // kernels + void (*idct_block_kernel)(stbi_uc * out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc * out, const stbi_uc * y, const stbi_uc * pcb, const stbi_uc * pcr, int count, + int step); + stbi_uc * (*resample_row_hv_2_kernel)(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman * h, int * count) { + int i, j, k = 0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i = 0; i < 16; ++i) { + for (j = 0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc)(i + 1); + if (k >= 257) + return stbi__err("bad size list", "Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for (j = 1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16)(code++); + if (code - 1 >= (1u << j)) + return stbi__err("bad code lengths", "Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16 - j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i = 0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS - s); + int m = 1 << (FAST_BITS - s); + for (j = 0; j < m; ++j) { + h->fast[c + j] = (stbi_uc)i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 * fast_ac, stbi__huffman * h) { + int i; + for (i = 0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) + k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16)((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg * j) { + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) + c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char)c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17] = {0, 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg * j, stbi__huffman * h) { + unsigned int temp; + int c, k; + + if (j->code_bits < 16) + stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k = FAST_BITS + 1;; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if (c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) + stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) + return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg * j, int n) { + unsigned int k; + if (j->code_bits < n) + stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) + return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg * j) { + unsigned int k; + if (j->code_bits < 1) + stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) + return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64 + 15] = { + 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, + 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg * j, short data[64], stbi__huffman * hdc, stbi__huffman * hac, stbi__int16 * fac, + int b, stbi__uint16 * dequant) { + int diff, dc, k; + int t; + + if (j->code_bits < 16) + stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) + return stbi__err("bad huffman code", "Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data, 0, 64 * sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) + return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) + return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short)(dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c, r, s; + if (j->code_bits < 16) + stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) + return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) + return stbi__err("bad huffman code", "Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) + break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg * j, short data[64], stbi__huffman * hdc, int b) { + int diff, dc; + int t; + if (j->spec_end != 0) + return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) + stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data, 0, 64 * sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) + return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) + return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) + return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short)(dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short)(1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg * j, short data[64], stbi__huffman * hac, stbi__int16 * fac) { + int k; + if (j->spec_start == 0) + return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c, r, s; + if (j->code_bits < 16) + stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) + return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) + return stbi__err("bad huffman code", "Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)(stbi__extend_receive(j, s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short)(1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short * p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit) == 0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r, s; + int rs = stbi__jpeg_huff_decode( + j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) + return stbi__err("bad huffman code", "Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) + return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short * p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit) == 0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short)s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) { + // trick to use a single test to catch both cases + if ((unsigned int)x > 255) { + if (x < 0) + return 0; + if (x > 255) + return 255; + } + return (stbi_uc)x; +} + +#define stbi__f2f(x) ((int)(((x)*4096 + 0.5))) +#define stbi__fsh(x) ((x)*4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0, s1, s2, s3, s4, s5, s6, s7) \ + int t0, t1, t2, t3, p1, p2, p3, p4, p5, x0, x1, x2, x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2 + p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3 * stbi__f2f(-1.847759065f); \ + t3 = p1 + p2 * stbi__f2f(0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2 + p3); \ + t1 = stbi__fsh(p2 - p3); \ + x0 = t0 + t3; \ + x3 = t0 - t3; \ + x1 = t1 + t2; \ + x2 = t1 - t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0 + t2; \ + p4 = t1 + t3; \ + p1 = t0 + t3; \ + p2 = t1 + t2; \ + p5 = (p3 + p4) * stbi__f2f(1.175875602f); \ + t0 = t0 * stbi__f2f(0.298631336f); \ + t1 = t1 * stbi__f2f(2.053119869f); \ + t2 = t2 * stbi__f2f(3.072711026f); \ + t3 = t3 * stbi__f2f(1.501321110f); \ + p1 = p5 + p1 * stbi__f2f(-0.899976223f); \ + p2 = p5 + p2 * stbi__f2f(-2.562915447f); \ + p3 = p3 * stbi__f2f(-1.961570560f); \ + p4 = p4 * stbi__f2f(-0.390180644f); \ + t3 += p1 + p4; \ + t2 += p2 + p3; \ + t1 += p2 + p4; \ + t0 += p1 + p3; + +static void stbi__idct_block(stbi_uc * out, int out_stride, short data[64]) { + int i, val[64], *v = val; + stbi_uc * o; + short * d = data; + + // columns + for (i = 0; i < 8; ++i, ++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0 && d[40] == 0 && d[48] == 0 && d[56] == 0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] * 4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; + x1 += 512; + x2 += 512; + x3 += 512; + v[0] = (x0 + t3) >> 10; + v[56] = (x0 - t3) >> 10; + v[8] = (x1 + t2) >> 10; + v[48] = (x1 - t2) >> 10; + v[16] = (x2 + t1) >> 10; + v[40] = (x2 - t1) >> 10; + v[24] = (x3 + t0) >> 10; + v[32] = (x3 - t0) >> 10; + } + } + + for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128 << 17); + x1 += 65536 + (128 << 17); + x2 += 65536 + (128 << 17); + x3 += 65536 + (128 << 17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0 + t3) >> 17); + o[7] = stbi__clamp((x0 - t3) >> 17); + o[1] = stbi__clamp((x1 + t2) >> 17); + o[6] = stbi__clamp((x1 - t2) >> 17); + o[2] = stbi__clamp((x2 + t1) >> 17); + o[5] = stbi__clamp((x2 - t1) >> 17); + o[3] = stbi__clamp((x3 + t0) >> 17); + o[4] = stbi__clamp((x3 - t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc * out, int out_stride, short data[64]) { + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + +// dot product constant: even elems=x, odd elems=y +#define dct_const(x, y) _mm_setr_epi16((x), (y), (x), (y), (x), (y), (x), (y)) + +// out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) +// out(1) = c1[even]*x + c1[odd]*y +#define dct_rot(out0, out1, x, y, c0, c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x), (y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x), (y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + +// out = in << 12 (in 16-bit, out 32-bit) +#define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + +// wide add +#define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + +// butterfly a/b, add bias, then shift by "s" and pack +#define dct_bfly32o(out0, out1, a, b, bias, s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + +// 8-bit interleave step (for transposes) +#define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + +// 16-bit interleave step (for transposes) +#define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + +#define dct_pass(bias, shift) \ + { \ + /* even part */ \ + dct_rot(t2e, t3e, row2, row6, rot0_0, rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o, y2o, row7, row3, rot2_0, rot2_1); \ + dct_rot(y1o, y3o, row5, row1, rot3_0, rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o, y5o, sum17, sum35, rot1_0, rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0, row7, x0, x7, bias, shift); \ + dct_bfly32o(row1, row6, x1, x6, bias, shift); \ + dct_bfly32o(row2, row5, x2, x5, bias, shift); \ + dct_bfly32o(row3, row4, x3, x4, bias, shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17)); + + // load + row0 = _mm_load_si128((const __m128i *)(data + 0 * 8)); + row1 = _mm_load_si128((const __m128i *)(data + 1 * 8)); + row2 = _mm_load_si128((const __m128i *)(data + 2 * 8)); + row3 = _mm_load_si128((const __m128i *)(data + 3 * 8)); + row4 = _mm_load_si128((const __m128i *)(data + 4 * 8)); + row5 = _mm_load_si128((const __m128i *)(data + 5 * 8)); + row6 = _mm_load_si128((const __m128i *)(data + 6 * 8)); + row7 = _mm_load_si128((const __m128i *)(data + 7 * 8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *)out, p0); + out += out_stride; + _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p0, 0x4e)); + out += out_stride; + _mm_storel_epi64((__m128i *)out, p2); + out += out_stride; + _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p2, 0x4e)); + out += out_stride; + _mm_storel_epi64((__m128i *)out, p1); + out += out_stride; + _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p1, 0x4e)); + out += out_stride; + _mm_storel_epi64((__m128i *)out, p3); + out += out_stride; + _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc * out, int out_stride, short data[64]) { + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0, out1, a, b, shiftop, s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0, row7, x0, x7, shiftop, shift); \ + dct_bfly32o(row1, row6, x1, x6, shiftop, shift); \ + dct_bfly32o(row2, row5, x2, x5, shiftop, shift); \ + dct_bfly32o(row3, row4, x3, x4, shiftop, shift); \ + } + + // load + row0 = vld1q_s16(data + 0 * 8); + row1 = vld1q_s16(data + 1 * 8); + row2 = vld1q_s16(data + 2 * 8); + row3 = vld1q_s16(data + 3 * 8); + row4 = vld1q_s16(data + 4 * 8); + row5 = vld1q_s16(data + 5 * 8); + row6 = vld1q_s16(data + 6 * 8); + row7 = vld1q_s16(data + 7 * 8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) \ + { \ + int16x8x2_t t = vtrnq_s16(x, y); \ + x = t.val[0]; \ + y = t.val[1]; \ + } +#define dct_trn32(x, y) \ + { \ + int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); \ + x = vreinterpretq_s16_s32(t.val[0]); \ + y = vreinterpretq_s16_s32(t.val[1]); \ + } +#define dct_trn64(x, y) \ + { \ + int16x8_t x0 = x; \ + int16x8_t y0 = y; \ + x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); \ + y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); \ + } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) \ + { \ + uint8x8x2_t t = vtrn_u8(x, y); \ + x = t.val[0]; \ + y = t.val[1]; \ + } +#define dct_trn8_16(x, y) \ + { \ + uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); \ + x = vreinterpret_u8_u16(t.val[0]); \ + y = vreinterpret_u8_u16(t.val[1]); \ + } +#define dct_trn8_32(x, y) \ + { \ + uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); \ + x = vreinterpret_u8_u32(t.val[0]); \ + y = vreinterpret_u8_u32(t.val[1]); \ + } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); + out += out_stride; + vst1_u8(out, p1); + out += out_stride; + vst1_u8(out, p2); + out += out_stride; + vst1_u8(out, p3); + out += out_stride; + vst1_u8(out, p4); + out += out_stride; + vst1_u8(out, p5); + out += out_stride; + vst1_u8(out, p6); + out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg * j) { + stbi_uc x; + if (j->marker != STBI__MARKER_none) { + x = j->marker; + j->marker = STBI__MARKER_none; + return x; + } + x = stbi__get8(j->s); + if (x != 0xff) + return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg * j) { + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg * z) { + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i, j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x + 7) >> 3; + int h = (z->img_comp[n].y + 7) >> 3; + for (j = 0; j < h; ++j) { + for (i = 0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, + z->dequant[z->img_comp[n].tq])) + return 0; + z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) + stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) + return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i, j, k, x, y; + STBI_SIMD_ALIGN(short, data[64]); + for (j = 0; j < z->img_mcu_y; ++j) { + for (i = 0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k = 0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y = 0; y < z->img_comp[n].v; ++y) { + for (x = 0; x < z->img_comp[n].h; ++x) { + int x2 = (i * z->img_comp[n].h + x) * 8; + int y2 = (j * z->img_comp[n].v + y) * 8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, + z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) + return 0; + z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2, z->img_comp[n].w2, + data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) + stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) + return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i, j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x + 7) >> 3; + int h = (z->img_comp[n].y + 7) >> 3; + for (j = 0; j < h; ++j) { + for (i = 0; i < w; ++i) { + short * data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) + stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) + return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i, j, k, x, y; + for (j = 0; j < z->img_mcu_y; ++j) { + for (i = 0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k = 0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y = 0; y < z->img_comp[n].v; ++y) { + for (x = 0; x < z->img_comp[n].h; ++x) { + int x2 = (i * z->img_comp[n].h + x); + int y2 = (j * z->img_comp[n].v + y); + short * data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) + stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) + return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short * data, stbi__uint16 * dequant) { + int i; + for (i = 0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg * z) { + if (z->progressive) { + // dequantize and idct the data + int i, j, n; + for (n = 0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x + 7) >> 3; + int h = (z->img_comp[n].y + 7) >> 3; + for (j = 0; j < h; ++j) { + for (i = 0; i < w; ++i) { + short * data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg * z, int m) { + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker", "Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) + return stbi__err("bad DRI len", "Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s) - 2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15, i; + if (p != 0 && p != 1) + return stbi__err("bad DQT type", "Corrupt JPEG"); + if (t > 3) + return stbi__err("bad DQT table", "Corrupt JPEG"); + + for (i = 0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L == 0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s) - 2; + while (L > 0) { + stbi_uc * v; + int sizes[16], i, n = 0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) + return stbi__err("bad DHT header", "Corrupt JPEG"); + for (i = 0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if (n > 256) + return stbi__err("bad DHT header", "Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc + th, sizes)) + return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac + th, sizes)) + return 0; + v = z->huff_ac[th].values; + } + for (i = 0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L == 0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len", "Corrupt JPEG"); + else + return stbi__err("bad APP len", "Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J', 'F', 'I', 'F', '\0'}; + int ok = 1; + int i; + for (i = 0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A', 'd', 'o', 'b', 'e', '\0'}; + int ok = 1; + int i; + for (i = 0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker", "Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg * z) { + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int)z->s->img_n) + return stbi__err("bad SOS component count", "Corrupt JPEG"); + if (Ls != 6 + 2 * z->scan_n) + return stbi__err("bad SOS len", "Corrupt JPEG"); + for (i = 0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) + return 0; // no match + z->img_comp[which].hd = q >> 4; + if (z->img_comp[which].hd > 3) + return stbi__err("bad DC huff", "Corrupt JPEG"); + z->img_comp[which].ha = q & 15; + if (z->img_comp[which].ha > 3) + return stbi__err("bad AC huff", "Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) + return stbi__err("bad SOS", "Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) + return stbi__err("bad SOS", "Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg * z, int ncomp, int why) { + int i; + for (i = 0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg * z, int scan) { + stbi__context * s = z->s; + int Lf, p, i, q, h_max = 1, v_max = 1, c; + Lf = stbi__get16be(s); + if (Lf < 11) + return stbi__err("bad SOF len", "Corrupt JPEG"); // JPEG + p = stbi__get8(s); + if (p != 8) + return stbi__err("only 8-bit", "JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); + if (s->img_y == 0) + return stbi__err("no header height", + "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); + if (s->img_x == 0) + return stbi__err("0 width", "Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) + return stbi__err("too large", "Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) + return stbi__err("too large", "Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) + return stbi__err("bad component count", "Corrupt JPEG"); + s->img_n = c; + for (i = 0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8 + 3 * s->img_n) + return stbi__err("bad SOF len", "Corrupt JPEG"); + + z->rgb = 0; + for (i = 0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = {'R', 'G', 'B'}; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); + if (!z->img_comp[i].h || z->img_comp[i].h > 4) + return stbi__err("bad H", "Corrupt JPEG"); + z->img_comp[i].v = q & 15; + if (!z->img_comp[i].v || z->img_comp[i].v > 4) + return stbi__err("bad V", "Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); + if (z->img_comp[i].tq > 3) + return stbi__err("bad TQ", "Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) + return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) + return stbi__err("too large", "Image too large to decode"); + + for (i = 0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) + h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) + v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i = 0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) + return stbi__err("bad H", "Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) + return stbi__err("bad V", "Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h; + + for (i = 0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i + 1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc *)(((size_t)z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i + 1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short *)(((size_t)z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg * z, int scan) { + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) + return stbi__err("no SOI", "Corrupt JPEG"); + if (scan == STBI__SCAN_type) + return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z, m)) + return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) + return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) + return 0; + return 1; +} + +static int stbi__skip_jpeg_junk_at_end(stbi__jpeg * j) { + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + while (x == 255) { // might be a marker + if (stbi__at_eof(j->s)) + return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg * j) { + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) + return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) + return 0; + if (!stbi__parse_entropy_coded_data(j)) + return 0; + if (j->marker == STBI__MARKER_none) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) + return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) + return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) + return 1; + m = stbi__get_marker(j); + } + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc * (*resample_row_func)(stbi_uc * out, stbi_uc * in0, stbi_uc * in1, int w, int hs); + +#define stbi__div4(x) ((stbi_uc)((x) >> 2)) + +static stbi_uc * resample_row_1(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc * stbi__resample_row_v_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i = 0; i < w; ++i) + out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc * stbi__resample_row_h_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { + // need to generate two samples horizontally for every one in input + int i; + stbi_uc * input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0] * 3 + input[1] + 2); + for (i = 1; i < w - 1; ++i) { + int n = 3 * input[i] + 2; + out[i * 2 + 0] = stbi__div4(n + input[i - 1]); + out[i * 2 + 1] = stbi__div4(n + input[i + 1]); + } + out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2); + out[i * 2 + 1] = input[w - 1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc)((x) >> 4)) + +static stbi_uc * stbi__resample_row_hv_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { + // need to generate 2x2 samples for every one in input + int i, t0, t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3 * in_near[0] + in_far[0]; + out[0] = stbi__div4(t1 + 2); + for (i = 1; i < w; ++i) { + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8); + out[i * 2] = stbi__div16(3 * t1 + t0 + 8); + } + out[w * 2 - 1] = stbi__div4(t1 + 2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc * stbi__resample_row_hv_2_simd(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { + // need to generate 2x2 samples for every one in input + int i = 0, t0, t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3 * in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w - 1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *)(in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *)(in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *)(out + i * 2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i * 2, o); +#endif + + // "previous" value for next iter + t1 = 3 * in_near[i + 7] + in_far[i + 7]; + } + + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2] = stbi__div16(3 * t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8); + out[i * 2] = stbi__div16(3 * t1 + t0 + 8); + } + out[w * 2 - 1] = stbi__div4(t1 + 2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc * stbi__resample_row_generic(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) { + // resample with nearest-neighbor + int i, j; + STBI_NOTUSED(in_far); + for (i = 0; i < w; ++i) + for (j = 0; j < hs; ++j) + out[i * hs + j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int)((x)*4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc * out, const stbi_uc * y, const stbi_uc * pcb, const stbi_uc * pcr, int count, + int step) { + int i; + for (i = 0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1 << 19); // rounding + int r, g, b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr * stbi__float2fixed(1.40200f); + g = y_fixed + (cr * -stbi__float2fixed(0.71414f)) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb * stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned)r > 255) { + if (r < 0) + r = 0; + else + r = 255; + } + if ((unsigned)g > 255) { + if (g < 0) + g = 0; + else + g = 255; + } + if ((unsigned)b > 255) { + if (b < 0) + b = 0; + else + b = 255; + } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc * out, stbi_uc const * y, stbi_uc const * pcb, stbi_uc const * pcr, int count, + int step) { + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16((short)(1.40200f * 4096.0f + 0.5f)); + __m128i cr_const1 = _mm_set1_epi16(-(short)(0.71414f * 4096.0f + 0.5f)); + __m128i cb_const0 = _mm_set1_epi16(-(short)(0.34414f * 4096.0f + 0.5f)); + __m128i cb_const1 = _mm_set1_epi16((short)(1.77200f * 4096.0f + 0.5f)); + __m128i y_bias = _mm_set1_epi8((char)(unsigned char)128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i + 7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *)(y + i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *)(pcr + i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *)(pcb + i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *)(out + 0), o0); + _mm_storeu_si128((__m128i *)(out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16((short)(1.40200f * 4096.0f + 0.5f)); + int16x8_t cr_const1 = vdupq_n_s16(-(short)(0.71414f * 4096.0f + 0.5f)); + int16x8_t cb_const0 = vdupq_n_s16(-(short)(0.34414f * 4096.0f + 0.5f)); + int16x8_t cb_const1 = vdupq_n_s16((short)(1.77200f * 4096.0f + 0.5f)); + + for (; i + 7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8 * 4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1 << 19); // rounding + int r, g, b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr * stbi__float2fixed(1.40200f); + g = y_fixed + cr * -stbi__float2fixed(0.71414f) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb * stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned)r > 255) { + if (r < 0) + r = 0; + else + r = 255; + } + if ((unsigned)g > 255) { + if (g < 0) + g = 0; + else + g = 255; + } + if ((unsigned)b > 255) { + if (b < 0) + b = 0; + else + b = 255; + } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg * j) { + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg * j) { stbi__free_jpeg_components(j, j->s->img_n, 0); } + +typedef struct { + resample_row_func resample; + stbi_uc *line0, *line1; + int hs, vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) { + unsigned int t = x * y + 128; + return (stbi_uc)((t + (t >> 8)) >> 8); +} + +static stbi_uc * load_jpeg_image(stbi__jpeg * z, int * out_x, int * out_y, int * comp, int req_comp) { + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) + return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { + stbi__cleanup_jpeg(z); + return NULL; + } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { + stbi__cleanup_jpeg(z); + return NULL; + } + + // resample and color-convert + { + int k; + unsigned int i, j; + stbi_uc * output; + stbi_uc * coutput[4] = {NULL, NULL, NULL, NULL}; + + stbi__resample res_comp[4]; + + for (k = 0; k < decode_n; ++k) { + stbi__resample * r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *)stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { + stbi__cleanup_jpeg(z); + return stbi__errpuc("outofmem", "Out of memory"); + } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs - 1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) + r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) + r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) + r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) + r->resample = z->resample_row_hv_2_kernel; + else + r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { + stbi__cleanup_jpeg(z); + return stbi__errpuc("outofmem", "Out of memory"); + } + + // now go ahead and resample + for (j = 0; j < z->s->img_y; ++j) { + stbi_uc * out = output + n * z->s->img_x * j; + for (k = 0; k < decode_n; ++k) { + stbi__resample * r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, y_bot ? r->line1 : r->line0, y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc * y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i = 0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i = 0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i = 0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i = 0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i = 0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i = 0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i = 0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i = 0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc * y = coutput[0]; + if (n == 1) + for (i = 0; i < z->s->img_x; ++i) + out[i] = y[i]; + else + for (i = 0; i < z->s->img_x; ++i) { + *out++ = y[i]; + *out++ = 255; + } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) + *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void * stbi__jpeg_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { + unsigned char * result; + stbi__jpeg * j = (stbi__jpeg *)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) + return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x, y, comp, req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context * s) { + int r; + stbi__jpeg * j = (stbi__jpeg *)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) + return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg * j, int * x, int * y, int * comp) { + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind(j->s); + return 0; + } + if (x) + *x = j->s->img_x; + if (y) + *y = j->s->img_y; + if (comp) + *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context * s, int * x, int * y, int * comp) { + int result; + stbi__jpeg * j = (stbi__jpeg *)(stbi__malloc(sizeof(stbi__jpeg))); + if (!j) + return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct { + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) { + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) { + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16 - bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman * z, const stbi_uc * sizelist, int num) { + int i, k = 0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i = 0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i = 1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i = 1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16)code; + z->firstsymbol[i] = (stbi__uint16)k; + code = (code + sizes[i]); + if (sizes[i]) + if (code - 1 >= (1 << i)) + return stbi__err("bad codelengths", "Corrupt PNG"); + z->maxcode[i] = code << (16 - i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i = 0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16)((s << 9) | i); + z->size[c] = (stbi_uc)s; + z->value[c] = (stbi__uint16)i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s], s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct { + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char * zout; + char * zout_start; + char * zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf * z) { return (z->zbuffer >= z->zbuffer_end); } + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf * z) { return stbi__zeof(z) ? 0 : *z->zbuffer++; } + +static void stbi__fill_bits(stbi__zbuf * z) { + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int)stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf * z, int n) { + unsigned int k; + if (z->num_bits < n) + stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf * a, stbi__zhuffman * z) { + int b, s, k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s = STBI__ZFAST_BITS + 1;; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) + return -1; // invalid code! + // code size is s, so: + b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) + return -1; // some data was corrupt somewhere! + if (z->size[b] != s) + return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf * a, stbi__zhuffman * z) { + int b, s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + return -1; /* report error for unexpected end of data. */ + } + stbi__fill_bits(a); + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf * z, char * zout, int n) // need to make room for n bytes +{ + char * q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) + return stbi__err("output buffer limit", "Corrupt PNG"); + cur = (unsigned int)(z->zout - z->zout_start); + limit = old_limit = (unsigned)(z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned)n) + return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if (limit > UINT_MAX / 2) + return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) + return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + +static const int stbi__zlength_extra[31] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0}; + +static const int stbi__zdist_base[32] = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, + 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, + 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; + +static const int stbi__zdist_extra[32] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, + 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +static int stbi__parse_huffman_block(stbi__zbuf * a) { + char * zout = a->zout; + for (;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) + return stbi__err("bad huffman code", "Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) + return 0; + zout = a->zout; + } + *zout++ = (char)z; + } else { + stbi_uc * p; + int len, dist; + if (z == 256) { + a->zout = zout; + return 1; + } + if (z >= 286) + return stbi__err("bad huffman code", + "Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) + len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0 || z >= 30) + return stbi__err("bad huffman code", + "Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) + dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) + return stbi__err("bad dist", "Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) + return 0; + zout = a->zout; + } + p = (stbi_uc *)(zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { + do + *zout++ = v; + while (--len); + } + } else { + if (len) { + do + *zout++ = *p++; + while (--len); + } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf * a) { + static const stbi_uc length_dezigzag[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286 + 32 + 137]; // padding for maximum single op + stbi_uc codelength_sizes[19]; + int i, n; + + int hlit = stbi__zreceive(a, 5) + 257; + int hdist = stbi__zreceive(a, 5) + 1; + int hclen = stbi__zreceive(a, 4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i = 0; i < hclen; ++i) { + int s = stbi__zreceive(a, 3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc)s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) + return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) + return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc)c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a, 2) + 3; + if (n == 0) + return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n - 1]; + } else if (c == 17) { + c = stbi__zreceive(a, 3) + 3; + } else if (c == 18) { + c = stbi__zreceive(a, 7) + 11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) + return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes + n, fill, c); + n += c; + } + } + if (n != ntot) + return stbi__err("bad codelengths", "Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) + return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist)) + return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf * a) { + stbi_uc header[4]; + int len, nlen, k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc)(a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) + return stbi__err("zlib corrupt", "Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) + return stbi__err("zlib corrupt", "Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) + return stbi__err("read past buffer", "Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) + return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf * a) { + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) + return stbi__err("bad zlib header", "Corrupt PNG"); // zlib spec + if ((cmf * 256 + flg) % 31 != 0) + return stbi__err("bad zlib header", "Corrupt PNG"); // zlib spec + if (flg & 32) + return stbi__err("no preset dict", "Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) + return stbi__err("bad compression", "Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = { + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8}; +static const stbi_uc stbi__zdefault_distance[32] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf * a, int parse_header) { + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) + return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a, 1); + type = stbi__zreceive(a, 2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) + return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, STBI__ZNSYMS)) + return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) + return 0; + } else { + if (!stbi__compute_huffman_codes(a)) + return 0; + } + if (!stbi__parse_huffman_block(a)) + return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf * a, char * obuf, int olen, int exp, int parse_header) { + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int * outlen) { + stbi__zbuf a; + char * p = (char *)stbi__malloc(initial_size); + if (p == NULL) + return NULL; + a.zbuffer = (stbi_uc *)buffer; + a.zbuffer_end = (stbi_uc *)buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) + *outlen = (int)(a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char * stbi_zlib_decode_malloc(char const * buffer, int len, int * outlen) { + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char * buffer, int len, int initial_size, int * outlen, + int parse_header) { + stbi__zbuf a; + char * p = (char *)stbi__malloc(initial_size); + if (p == NULL) + return NULL; + a.zbuffer = (stbi_uc *)buffer; + a.zbuffer_end = (stbi_uc *)buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) + *outlen = (int)(a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char * obuffer, int olen, char const * ibuffer, int ilen) { + stbi__zbuf a; + a.zbuffer = (stbi_uc *)ibuffer; + a.zbuffer_end = (stbi_uc *)ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int)(a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char * stbi_zlib_decode_noheader_malloc(char const * buffer, int len, int * outlen) { + stbi__zbuf a; + char * p = (char *)stbi__malloc(16384); + if (p == NULL) + return NULL; + a.zbuffer = (stbi_uc *)buffer; + a.zbuffer_end = (stbi_uc *)buffer + len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) + *outlen = (int)(a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char * obuffer, int olen, const char * ibuffer, int ilen) { + stbi__zbuf a; + a.zbuffer = (stbi_uc *)ibuffer; + a.zbuffer_end = (stbi_uc *)ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int)(a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct { + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context * s) { + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context * s) { + static const stbi_uc png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + int i; + for (i = 0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) + return stbi__err("bad png sig", "Not a PNG"); + return 1; +} + +typedef struct { + stbi__context * s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + +enum { + STBI__F_none = 0, + STBI__F_sub = 1, + STBI__F_up = 2, + STBI__F_avg = 3, + STBI__F_paeth = 4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = {STBI__F_none, STBI__F_sub, STBI__F_none, STBI__F_avg_first, STBI__F_paeth_first}; + +static int stbi__paeth(int a, int b, int c) { + int p = a + b - c; + int pa = abs(p - a); + int pb = abs(p - b); + int pc = abs(p - c); + if (pa <= pb && pa <= pc) + return a; + if (pb <= pc) + return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = {0, 0xff, 0x55, 0, 0x11, 0, 0, 0, 0x01}; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png * a, stbi_uc * raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, + stbi__uint32 y, int depth, int color) { + int bytes = (depth == 16 ? 2 : 1); + stbi__context * s = a->s; + stbi__uint32 i, j, stride = x * out_n * bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n * bytes; + int filter_bytes = img_n * bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1); + a->out = (stbi_uc *)stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) + return stbi__err("outofmem", "Out of memory"); + + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) + return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) + return stbi__err("not enough pixels", "Corrupt PNG"); + + for (j = 0; j < y; ++j) { + stbi_uc * cur = a->out + stride * j; + stbi_uc * prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter", "Corrupt PNG"); + + if (depth < 8) { + if (img_width_bytes > x) + return stbi__err("invalid width", "Corrupt PNG"); + cur += x * out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) + filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k = 0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none: + cur[k] = raw[k]; + break; + case STBI__F_sub: + cur[k] = raw[k]; + break; + case STBI__F_up: + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1)); + break; + case STBI__F_paeth: + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0)); + break; + case STBI__F_avg_first: + cur[k] = raw[k]; + break; + case STBI__F_paeth_first: + cur[k] = raw[k]; + break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes + 1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1) * filter_bytes; +#define STBI__CASE(f) \ + case f: \ + for (k = 0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: + memcpy(cur, raw, nk); + break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); } + break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } + break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); } + break; + STBI__CASE(STBI__F_paeth) { + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); + } + break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); } + break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); } + break; + } +#undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n + 1 == out_n); +#define STBI__CASE(f) \ + case f: \ + for (i = x - 1; i >= 1; --i, cur[filter_bytes] = 255, raw += filter_bytes, cur += output_bytes, prior += output_bytes) \ + for (k = 0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } + break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]); } + break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } + break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1)); } + break; + STBI__CASE(STBI__F_paeth) { + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes])); + } + break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1)); } + break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0)); } + break; + } +#undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride * j; // start at the beginning of the row again + for (i = 0; i < x; ++i, cur += output_bytes) { + cur[filter_bytes + 1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j = 0; j < y; ++j) { + stbi_uc * cur = a->out + stride * j; + stbi_uc * in = a->out + stride * j + x * out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for + // 1/2/4-bit png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that + // will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k = x * img_n; k >= 2; k -= 2, ++in) { + *cur++ = scale * ((*in >> 4)); + *cur++ = scale * ((*in) & 0x0f); + } + if (k > 0) + *cur++ = scale * ((*in >> 4)); + } else if (depth == 2) { + for (k = x * img_n; k >= 4; k -= 4, ++in) { + *cur++ = scale * ((*in >> 6)); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in) & 0x03); + } + if (k > 0) + *cur++ = scale * ((*in >> 6)); + if (k > 1) + *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) + *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k = x * img_n; k >= 8; k -= 8, ++in) { + *cur++ = scale * ((*in >> 7)); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in) & 0x01); + } + if (k > 0) + *cur++ = scale * ((*in >> 7)); + if (k > 1) + *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) + *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) + *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) + *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) + *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) + *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride * j; + if (img_n == 1) { + for (q = x - 1; q >= 0; --q) { + cur[q * 2 + 1] = 255; + cur[q * 2 + 0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q = x - 1; q >= 0; --q) { + cur[q * 4 + 3] = 255; + cur[q * 4 + 2] = cur[q * 3 + 2]; + cur[q * 4 + 1] = cur[q * 3 + 1]; + cur[q * 4 + 0] = cur[q * 3 + 0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc * cur = a->out; + stbi__uint16 * cur16 = (stbi__uint16 *)cur; + + for (i = 0; i < x * y * out_n; ++i, cur16++, cur += 2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png * a, stbi_uc * image_data, stbi__uint32 image_data_len, int out_n, int depth, + int color, int interlaced) { + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc * final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *)stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) + return stbi__err("outofmem", "Out of memory"); + for (p = 0; p < 7; ++p) { + int xorig[] = {0, 4, 0, 2, 0, 1, 0}; + int yorig[] = {0, 0, 4, 0, 2, 0, 1}; + int xspc[] = {8, 8, 4, 4, 2, 2, 1}; + int yspc[] = {8, 8, 8, 4, 4, 2, 2}; + int i, j, x, y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j = 0; j < y; ++j) { + for (i = 0; i < x; ++i) { + int out_y = j * yspc[p] + yorig[p]; + int out_x = i * xspc[p] + xorig[p]; + memcpy(final + out_y * a->s->img_x * out_bytes + out_x * out_bytes, a->out + (j * x + i) * out_bytes, + out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png * z, stbi_uc tc[3], int out_n) { + stbi__context * s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc * p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png * z, stbi__uint16 tc[3], int out_n) { + stbi__context * s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 * p = (stbi__uint16 *)z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png * a, stbi_uc * palette, int len, int pal_img_n) { + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *)stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) + return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i = 0; i < pixel_count; ++i) { + int n = orig[i] * 4; + p[0] = palette[n]; + p[1] = palette[n + 1]; + p[2] = palette[n + 2]; + p += 3; + } + } else { + for (i = 0; i < pixel_count; ++i) { + int n = orig[i] * 4; + p[0] = palette[n]; + p[1] = palette[n + 1]; + p[2] = palette[n + 2]; + p[3] = palette[n + 3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) { + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) { + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) { + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) { + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load \ + (stbi__unpremultiply_on_load_set ? stbi__unpremultiply_on_load_local : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set ? stbi__de_iphone_flag_local : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png * z) { + stbi__context * s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc * p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i = 0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i = 0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = (t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i = 0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a, b, c, d) (((unsigned)(a) << 24) + ((unsigned)(b) << 16) + ((unsigned)(c) << 8) + (unsigned)(d)) + +static int stbi__parse_png_file(stbi__png * z, int scan, int req_comp) { + stbi_uc palette[1024], pal_img_n = 0; + stbi_uc has_trans = 0, tc[3] = {0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0; + int first = 1, k, interlace = 0, color = 0, is_iphone = 0; + stbi__context * s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) + return 0; + + if (scan == STBI__SCAN_type) + return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C', 'g', 'B', 'I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I', 'H', 'D', 'R'): { + int comp, filter; + if (!first) + return stbi__err("multiple IHDR", "Corrupt PNG"); + first = 0; + if (c.length != 13) + return stbi__err("bad IHDR len", "Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) + return stbi__err("too large", "Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) + return stbi__err("too large", "Very large image (corrupt?)"); + z->depth = stbi__get8(s); + if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) + return stbi__err("1/2/4/8/16-bit only", "PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); + if (color > 6) + return stbi__err("bad ctype", "Corrupt PNG"); + if (color == 3 && z->depth == 16) + return stbi__err("bad ctype", "Corrupt PNG"); + if (color == 3) + pal_img_n = 3; + else if (color & 1) + return stbi__err("bad ctype", "Corrupt PNG"); + comp = stbi__get8(s); + if (comp) + return stbi__err("bad comp method", "Corrupt PNG"); + filter = stbi__get8(s); + if (filter) + return stbi__err("bad filter method", "Corrupt PNG"); + interlace = stbi__get8(s); + if (interlace > 1) + return stbi__err("bad interlace method", "Corrupt PNG"); + if (!s->img_x || !s->img_y) + return stbi__err("0-pixel image", "Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) + return stbi__err("too large", "Image too large to decode"); + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) + return stbi__err("too large", "Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P', 'L', 'T', 'E'): { + if (first) + return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256 * 3) + return stbi__err("invalid PLTE", "Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) + return stbi__err("invalid PLTE", "Corrupt PNG"); + for (i = 0; i < pal_len; ++i) { + palette[i * 4 + 0] = stbi__get8(s); + palette[i * 4 + 1] = stbi__get8(s); + palette[i * 4 + 2] = stbi__get8(s); + palette[i * 4 + 3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t', 'R', 'N', 'S'): { + if (first) + return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) + return stbi__err("tRNS after IDAT", "Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { + s->img_n = 4; + return 1; + } + if (pal_len == 0) + return stbi__err("tRNS before PLTE", "Corrupt PNG"); + if (c.length > pal_len) + return stbi__err("bad tRNS len", "Corrupt PNG"); + pal_img_n = 4; + for (i = 0; i < c.length; ++i) + palette[i * 4 + 3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) + return stbi__err("tRNS with alpha", "Corrupt PNG"); + if (c.length != (stbi__uint32)s->img_n * 2) + return stbi__err("bad tRNS len", "Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { + ++s->img_n; + return 1; + } + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) + tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) + tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * + stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I', 'D', 'A', 'T'): { + if (first) + return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) + return stbi__err("no PLTE", "Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) + return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if ((int)(ioff + c.length) < (int)ioff) + return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc * p; + if (idata_limit == 0) + idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); + if (p == NULL) + return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata + ioff, c.length)) + return stbi__err("outofdata", "Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I', 'E', 'N', 'D'): { + stbi__uint32 raw_len, bpl; + if (first) + return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) + return 1; + if (z->idata == NULL) + return stbi__err("no IDAT", "Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *)stbi_zlib_decode_malloc_guesssize_headerflag((char *)z->idata, ioff, raw_len, + (int *)&raw_len, !is_iphone); + if (z->expanded == NULL) + return 0; // zlib should set error + STBI_FREE(z->idata); + z->idata = NULL; + if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n + 1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) + return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) + return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) + return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) + s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); + z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) + return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { +#ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); +#endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void * stbi__do_png(stbi__png * p, int * x, int * y, int * n, int req_comp, stbi__result_info * ri) { + void * result = NULL; + if (req_comp < 0 || req_comp > 4) + return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) + return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) + *n = p->s->img_n; + } + STBI_FREE(p->out); + p->out = NULL; + STBI_FREE(p->expanded); + p->expanded = NULL; + STBI_FREE(p->idata); + p->idata = NULL; + + return result; +} + +static void * stbi__png_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { + stbi__png p; + p.s = s; + return stbi__do_png(&p, x, y, comp, req_comp, ri); +} + +static int stbi__png_test(stbi__context * s) { + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png * p, int * x, int * y, int * comp) { + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind(p->s); + return 0; + } + if (x) + *x = p->s->img_x; + if (y) + *y = p->s->img_y; + if (comp) + *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context * s, int * x, int * y, int * comp) { + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context * s) { + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context * s) { + int r; + int sz; + if (stbi__get8(s) != 'B') + return 0; + if (stbi__get8(s) != 'M') + return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context * s) { + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) { + int n = 0; + if (z == 0) + return -1; + if (z >= 0x10000) { + n += 16; + z >>= 16; + } + if (z >= 0x00100) { + n += 8; + z >>= 8; + } + if (z >= 0x00010) { + n += 4; + z >>= 4; + } + if (z >= 0x00004) { + n += 2; + z >>= 2; + } + if (z >= 0x00002) { + n += 1; /* >>= 1;*/ + } + return n; +} + +static int stbi__bitcount(unsigned int a) { + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) { + static unsigned int mul_table[9] = { + 0, + 0xff /*0b11111111*/, + 0x55 /*0b01010101*/, + 0x49 /*0b01001001*/, + 0x11 /*0b00010001*/, + 0x21 /*0b00100001*/, + 0x41 /*0b01000001*/, + 0x81 /*0b10000001*/, + 0x01 /*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0, 0, 1, 0, 2, 4, 6, 0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8 - bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int)((unsigned)v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct { + int bpp, offset, hsz; + unsigned int mr, mg, mb, ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data * info, int compress) { + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void * stbi__bmp_parse_header(stbi__context * s, stbi__bmp_data * info) { + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') + return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) + return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) + return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) + return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) + return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) + return stbi__errpuc("BMP JPEG/PNG", + "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) + return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i = 0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *)1; +} + +static void * stbi__bmp_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { + stbi_uc * out; + unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a; + stbi_uc pal[256][4]; + int psize = 0, i, j, width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int)s->img_y) > 0; + s->img_y = abs((int)s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256 * 4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *)stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) + return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z = 0; + if (psize == 0 || psize > 256) { + STBI_FREE(out); + return stbi__errpuc("invalid", "Corrupt BMP"); + } + for (i = 0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) + stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) + width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) + width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) + width = s->img_x; + else { + STBI_FREE(out); + return stbi__errpuc("bad bpp", "Corrupt BMP"); + } + pad = (-width) & 3; + if (info.bpp == 1) { + for (j = 0; j < (int)s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i = 0; i < (int)s->img_x; ++i) { + int color = (v >> bit_offset) & 0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) + out[z++] = 255; + if (i + 1 == (int)s->img_x) + break; + if ((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j = 0; j < (int)s->img_y; ++j) { + for (i = 0; i < (int)s->img_x; i += 2) { + int v = stbi__get8(s), v2 = 0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) + out[z++] = 255; + if (i + 1 == (int)s->img_x) + break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) + out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0; + int z = 0; + int easy = 0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) + width = 3 * s->img_x; + else if (info.bpp == 16) + width = 2 * s->img_x; + else /* bpp = 32 and pad = 0 */ + width = 0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { + STBI_FREE(out); + return stbi__errpuc("bad masks", "Corrupt BMP"); + } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr) - 7; + rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg) - 7; + gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb) - 7; + bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma) - 7; + acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { + STBI_FREE(out); + return stbi__errpuc("bad masks", "Corrupt BMP"); + } + } + for (j = 0; j < (int)s->img_y; ++j) { + if (easy) { + for (i = 0; i < (int)s->img_x; ++i) { + unsigned char a; + out[z + 2] = stbi__get8(s); + out[z + 1] = stbi__get8(s); + out[z + 0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) + out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i = 0; i < (int)s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) + out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j = 0; j < (int)s->img_y >> 1; ++j) { + stbi_uc * p1 = out + j * s->img_x * target; + stbi_uc * p2 = out + (s->img_y - 1 - j) * s->img_x * target; + for (i = 0; i < (int)s->img_x * target; ++i) { + t = p1[i]; + p1[i] = p2[i]; + p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) + return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) + *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int * is_rgb16) { + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) + *is_rgb16 = 0; + switch (bits_per_pixel) { + case 8: + return STBI_grey; + case 16: + if (is_grey) + return STBI_grey_alpha; + // fallthrough + case 15: + if (is_rgb16) + *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: + return bits_per_pixel / 8; + default: + return 0; + } +} + +static int stbi__tga_info(stbi__context * s, int * x, int * y, int * comp) { + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if (tga_colormap_type > 1) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if (tga_colormap_type == 1) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s, 9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if (tga_w < 1) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if (tga_h < 1) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if (!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) + *x = tga_w; + if (y) + *y = tga_h; + if (comp) + *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context * s) { + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if (tga_color_type > 1) + goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if (tga_color_type == 1) { // colormapped (paletted) image + if (sz != 1 && sz != 9) + goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s, 4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) + goto errorEnd; + stbi__skip(s, 4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11)) + goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s, 9); // skip colormap specification and image x/y origin + } + if (stbi__get16le(s) < 1) + goto errorEnd; // test width + if (stbi__get16le(s) < 1) + goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ((tga_color_type == 1) && (sz != 8) && (sz != 16)) + goto errorEnd; // for colormapped images, bpp is size of an index + if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) + goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context * s, stbi_uc * out) { + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255) / 31); + out[1] = (stbi_uc)((g * 255) / 31); + out[2] = (stbi_uc)((b * 255) / 31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void * stbi__tga_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16 = 0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char * tga_data; + unsigned char * tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + + // do a tiny bit of precessing + if (tga_image_type >= 8) { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if (tga_indexed) + tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if (!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) + *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char *)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) + return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset); + + if (!tga_indexed && !tga_is_RLE && !tga_rgb16) { + for (i = 0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height - i - 1 : i; + stbi_uc * tga_row = tga_data + row * tga_width * tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if (tga_indexed) { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start); + // load the palette + tga_palette = (unsigned char *)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc * pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i = 0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i = 0; i < tga_width * tga_height; ++i) { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if (tga_is_RLE) { + if (RLE_count == 0) { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if (!RLE_repeating) { + read_next_pixel = 1; + } + } else { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if (read_next_pixel) { + // load however much data we did have + if (tga_indexed) { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if (pal_idx >= tga_palette_len) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx + j]; + } + } else if (tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i * tga_comp + j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if (tga_inverted) { + for (j = 0; j * 2 < tga_height; ++j) { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if (tga_palette != NULL) { + STBI_FREE(tga_palette); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) { + unsigned char * tga_pixel = tga_data; + for (i = 0; i < tga_width * tga_height; ++i) { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context * s) { + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context * s, stbi_uc * p, int pixelCount) { + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) + return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) + return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void * stbi__psd_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, int bpc) { + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w, h; + stbi_uc * out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s, stbi__get32be(s)); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s)); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s)); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *)stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *)stbi__malloc(4 * w * h); + + if (!out) + return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w * h; + + // Initialize the data to zero. + // memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc * p; + + p = out + channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 * q = ((stbi__uint16 *)out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc * p = out + channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 * q = ((stbi__uint16 *)out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16)stbi__get16be(s); + } else { + stbi_uc * p = out + channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc)(stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i = 0; i < w * h; ++i) { + stbi__uint16 * pixel = (stbi__uint16 *)out + 4 * i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a); + pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a); + pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a); + } + } + } else { + for (i = 0; i < w * h; ++i) { + unsigned char * pixel = out + 4 * i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char)(pixel[0] * ra + inv_a); + pixel[1] = (unsigned char)(pixel[1] * ra + inv_a); + pixel[2] = (unsigned char)(pixel[2] * ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) + return out; // stbi__convert_format frees input on failure + } + + if (comp) + *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context * s, const char * str) { + int i; + for (i = 0; i < 4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context * s) { + int i; + + if (!stbi__pic_is4(s, "\x53\x80\xF6\x34")) + return 0; + + for (i = 0; i < 84; ++i) + stbi__get8(s); + + if (!stbi__pic_is4(s, "PICT")) + return 0; + + return 1; +} + +typedef struct { + stbi_uc size, type, channel; +} stbi__pic_packet; + +static stbi_uc * stbi__readval(stbi__context * s, int channel, stbi_uc * dest) { + int mask = 0x80, i; + + for (i = 0; i < 4; ++i, mask >>= 1) { + if (channel & mask) { + if (stbi__at_eof(s)) + return stbi__errpuc("bad file", "PIC file too short"); + dest[i] = stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel, stbi_uc * dest, const stbi_uc * src) { + int mask = 0x80, i; + + for (i = 0; i < 4; ++i, mask >>= 1) + if (channel & mask) + dest[i] = src[i]; +} + +static stbi_uc * stbi__pic_load_core(stbi__context * s, int width, int height, int * comp, stbi_uc * result) { + int act_comp = 0, num_packets = 0, y, chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet * packet; + + if (num_packets == sizeof(packets) / sizeof(packets[0])) + return stbi__errpuc("bad format", "too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) + return stbi__errpuc("bad file", "file too short (reading packets)"); + if (packet->size != 8) + return stbi__errpuc("bad format", "packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for (y = 0; y < height; ++y) { + int packet_idx; + + for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) { + stbi__pic_packet * packet = &packets[packet_idx]; + stbi_uc * dest = result + y * width * 4; + + switch (packet->type) { + default: + return stbi__errpuc("bad format", "packet has bad compression type"); + + case 0: { // uncompressed + int x; + + for (x = 0; x < width; ++x, dest += 4) + if (!stbi__readval(s, packet->channel, dest)) + return 0; + break; + } + + case 1: // Pure RLE + { + int left = width, i; + + while (left > 0) { + stbi_uc count, value[4]; + + count = stbi__get8(s); + if (stbi__at_eof(s)) + return stbi__errpuc("bad file", "file too short (pure read count)"); + + if (count > left) + count = (stbi_uc)left; + + if (!stbi__readval(s, packet->channel, value)) + return 0; + + for (i = 0; i < count; ++i, dest += 4) + stbi__copyval(packet->channel, dest, value); + left -= count; + } + } break; + + case 2: { // Mixed RLE + int left = width; + while (left > 0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) + return stbi__errpuc("bad file", "file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count == 128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file", "scanline overrun"); + + if (!stbi__readval(s, packet->channel, value)) + return 0; + + for (i = 0; i < count; ++i, dest += 4) + stbi__copyval(packet->channel, dest, value); + } else { // Raw + ++count; + if (count > left) + return stbi__errpuc("bad file", "scanline overrun"); + + for (i = 0; i < count; ++i, dest += 4) + if (!stbi__readval(s, packet->channel, dest)) + return 0; + } + left -= count; + } + break; + } + } + } + } + + return result; +} + +static void * stbi__pic_load(stbi__context * s, int * px, int * py, int * comp, int req_comp, stbi__result_info * ri) { + stbi_uc * result; + int i, x, y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) + comp = &internal_comp; + + for (i = 0; i < 92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + + if (stbi__at_eof(s)) + return stbi__errpuc("bad file", "file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) + return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); // skip `ratio' + stbi__get16be(s); // skip `fields' + stbi__get16be(s); // skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *)stbi__malloc_mad3(x, y, 4, 0); + if (!result) + return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x * y * 4); + + if (!stbi__pic_load_core(s, x, y, comp, result)) { + STBI_FREE(result); + result = 0; + } + *px = x; + *py = y; + if (req_comp == 0) + req_comp = *comp; + result = stbi__convert_format(result, 4, req_comp, x, y); + + return result; +} + +static int stbi__pic_test(stbi__context * s) { + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct { + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct { + int w, h; + stbi_uc * out; // output buffer (always 4 components) + stbi_uc * background; // The current "background" as far as a gif is concerned + stbi_uc * history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc * color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context * s) { + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') + return 0; + if (stbi__get8(s) != 'a') + return 0; + return 1; +} + +static int stbi__gif_test(stbi__context * s) { + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context * s, stbi_uc pal[256][4], int num_entries, int transp) { + int i; + for (i = 0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context * s, stbi__gif * g, int * comp, int is_info) { + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') + return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') + return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) + return stbi__err("too large", "Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) + return stbi__err("too large", "Very large image (corrupt?)"); + + if (comp != 0) + *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) + return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context * s, int * x, int * y, int * comp) { + stbi__gif * g = (stbi__gif *)stbi__malloc(sizeof(stbi__gif)); + if (!g) + return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind(s); + return 0; + } + if (x) + *x = g->w; + if (y) + *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif * g, stbi__uint16 code) { + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) + return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc * stbi__process_gif_raster(stbi__context * s, stbi__gif * g) { + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw * p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) + return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc)init_code; + g->codes[init_code].suffix = (stbi_uc)init_code; + } + + // support no starting clear code + avail = clear + 2; + oldcode = -1; + + len = 0; + for (;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32)stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s, len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16)oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16)code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc * stbi__gif_load_next(stbi__context * s, stbi__gif * g, int * comp, int req_comp, stbi_uc * two_back) { + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp, 0)) + return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *)stbi__malloc(4 * pcount); + g->background = (stbi_uc *)stbi__malloc(4 * pcount); + g->history = (stbi_uc *)stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy(&g->out[pi * 4], &two_back[pi * 4], 4); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy(&g->out[pi * 4], &g->background[pi * 4], 4); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy(g->background, g->out, 4 * g->w * g->h); + } + + // clear my history; + memset(g->history, 0x00, g->w * g->h); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc * o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *)g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *)g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) + return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = + 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy(&g->out[pi * 4], &g->pal[g->bgindex], 4); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *)s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void * stbi__load_gif_main_outofmem(stbi__gif * g, stbi_uc * out, int ** delays) { + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) + STBI_FREE(out); + if (delays && *delays) + STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void * stbi__load_gif_main(stbi__context * s, int ** delays, int * x, int * y, int * z, int * comp, int req_comp) { + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc * u = 0; + stbi_uc * out = 0; + stbi_uc * two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *)s) + u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void * tmp = (stbi_uc *)STBI_REALLOC_SIZED(out, out_size, layers * stride); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc *)tmp; + out_size = layers * stride; + } + + if (delays) { + int * new_delays = (int *)STBI_REALLOC_SIZED(*delays, delays_size, sizeof(int) * layers); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc *)stbi__malloc(layers * stride); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int *)stbi__malloc(layers * sizeof(int)); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy(out + ((layers - 1) * stride), u, stride); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void * stbi__gif_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { + stbi_uc * u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *)s) + u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context * s, int * x, int * y, int * comp) { return stbi__gif_info_raw(s, x, y, comp); } +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context * s, const char * signature) { + int i; + for (i = 0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context * s) { + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if (!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char * stbi__hdr_gettoken(stbi__context * z, char * buffer) { + int len = 0; + char c = '\0'; + + c = (char)stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN - 1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char)stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float * output, stbi_uc * input, int req_comp) { + if (input[3] != 0) { + float f1; + // Exponent + f1 = (float)ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) + output[1] = 1; + if (req_comp == 4) + output[3] = 1; + } else { + switch (req_comp) { + case 4: + output[3] = 1; /* fallthrough */ + case 3: + output[0] = output[1] = output[2] = 0; + break; + case 2: + output[1] = 1; /* fallthrough */ + case 1: + output[0] = 0; + break; + } + } +} + +static float * stbi__hdr_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { + char buffer[STBI__HDR_BUFLEN]; + char * token; + int valid = 0; + int width, height; + stbi_uc * scanline; + float * hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1, c2, z; + const char * headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s, buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for (;;) { + token = stbi__hdr_gettoken(s, buffer); + if (token[0] == 0) + break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) + valid = 1; + } + + if (!valid) + return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s, buffer); + if (strncmp(token, "-Y ", 3)) + return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int)strtol(token, &token, 10); + while (*token == ' ') + ++token; + if (strncmp(token, "+X ", 3)) + return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int)strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) + return stbi__errpf("too large", "Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) + return stbi__errpf("too large", "Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) + *comp = 3; + if (req_comp == 0) + req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *)stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if (width < 8 || width >= 32768) { + // Read flat data + for (j = 0; j < height; ++j) { + for (i = 0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc)c1; + rgbe[1] = (stbi_uc)c2; + rgbe[2] = (stbi_uc)len; + rgbe[3] = (stbi_uc)stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { + STBI_FREE(hdr_data); + STBI_FREE(scanline); + return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); + } + if (scanline == NULL) { + scanline = (stbi_uc *)stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { + STBI_FREE(hdr_data); + STBI_FREE(scanline); + return stbi__errpf("corrupt", "bad RLE data in HDR"); + } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { + STBI_FREE(hdr_data); + STBI_FREE(scanline); + return stbi__errpf("corrupt", "bad RLE data in HDR"); + } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i = 0; i < width; ++i) + stbi__hdr_convert(hdr_data + (j * width + i) * req_comp, scanline + i * 4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context * s, int * x, int * y, int * comp) { + char buffer[STBI__HDR_BUFLEN]; + char * token; + int valid = 0; + int dummy; + + if (!x) + x = &dummy; + if (!y) + y = &dummy; + if (!comp) + comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind(s); + return 0; + } + + for (;;) { + token = stbi__hdr_gettoken(s, buffer); + if (token[0] == 0) + break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) + valid = 1; + } + + if (!valid) { + stbi__rewind(s); + return 0; + } + token = stbi__hdr_gettoken(s, buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind(s); + return 0; + } + token += 3; + *y = (int)strtol(token, &token, 10); + while (*token == ' ') + ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind(s); + return 0; + } + token += 3; + *x = (int)strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context * s, int * x, int * y, int * comp) { + void * p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind(s); + return 0; + } + if (x) + *x = s->img_x; + if (y) + *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context * s, int * x, int * y, int * comp) { + int channelCount, dummy, depth; + if (!x) + x = &dummy; + if (!y) + y = &dummy; + if (!comp) + comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind(s); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind(s); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind(s); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind(s); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context * s) { + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind(s); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind(s); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind(s); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context * s, int * x, int * y, int * comp) { + int act_comp = 0, num_packets = 0, chained, dummy; + stbi__pic_packet packets[10]; + + if (!x) + x = &dummy; + if (!y) + y = &dummy; + if (!comp) + comp = &dummy; + + if (!stbi__pic_is4(s, "\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind(s); + return 0; + } + if ((*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet * packet; + + if (num_packets == sizeof(packets) / sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind(s); + return 0; + } + if (packet->size != 8) { + stbi__rewind(s); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context * s) { + char p, t; + p = (char)stbi__get8(s); + t = (char)stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + return 1; +} + +static void * stbi__pnm_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) { + stbi_uc * out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) + return stbi__errpuc("too large", "Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) + *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *)stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) + return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if (out == NULL) + return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; } + +static void stbi__pnm_skip_whitespace(stbi__context * s, char * c) { + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char)stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r') + *c = (char)stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) { return c >= '0' && c <= '9'; } + +static int stbi__pnm_getinteger(stbi__context * s, char * c) { + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value * 10 + (*c - '0'); + *c = (char)stbi__get8(s); + if ((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context * s, int * x, int * y, int * comp) { + int maxv, dummy; + char c, p, t; + + if (!x) + x = &dummy; + if (!y) + y = &dummy; + if (!comp) + comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char)stbi__get8(s); + t = (char)stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char)stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if (*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context * s) { + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context * s, int * x, int * y, int * comp) { +#ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) + return 1; +#endif + +#ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) + return 1; +#endif + +#ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) + return 1; +#endif + +#ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) + return 1; +#endif + +#ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) + return 1; +#endif + +#ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) + return 1; +#endif + +#ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) + return 1; +#endif + +#ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) + return 1; +#endif + +// test tga last because it's a crappy test! +#ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; +#endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context * s) { +#ifndef STBI_NO_PNG + if (stbi__png_is16(s)) + return 1; +#endif + +#ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) + return 1; +#endif + +#ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) + return 1; +#endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const * filename, int * x, int * y, int * comp) { + FILE * f = stbi__fopen(filename, "rb"); + int result; + if (!f) + return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE * f, int * x, int * y, int * comp) { + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s, x, y, comp); + fseek(f, pos, SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const * filename) { + FILE * f = stbi__fopen(filename, "rb"); + int result; + if (!f) + return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE * f) { + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f, pos, SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp) { + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__info_main(&s, x, y, comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const * c, void * user, int * x, int * y, int * comp) { + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)c, user); + return stbi__info_main(&s, x, y, comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const * buffer, int len) { + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const * c, void * user) { + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks + anyway error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) fix inefficiency in + decoding 32-bit BMP (David Woo) 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/src/cpp/src/utils.cpp b/src/cpp/src/utils.cpp index bbed932304..823ac7fd6e 100644 --- a/src/cpp/src/utils.cpp +++ b/src/cpp/src/utils.cpp @@ -153,15 +153,6 @@ ov::Tensor extend_attention(ov::Tensor attention_mask) { return new_atten_mask; } -ov::genai::GenerationConfig from_config_json_if_exists(const std::filesystem::path& model_path) { - auto config_file_path = model_path / "generation_config.json"; - if (std::filesystem::exists(config_file_path)) { - return ov::genai::GenerationConfig((config_file_path).string()); - } else { - return ov::genai::GenerationConfig{}; - } -} - ov::genai::StreamerVariant get_streamer_from_map(const ov::AnyMap& config_map) { ov::genai::StreamerVariant streamer = std::monostate(); @@ -183,6 +174,22 @@ ov::genai::OptionalGenerationConfig get_config_from_map(const ov::AnyMap& config return std::nullopt; } +ProcessorConfig from_any_map( + const ov::AnyMap& config_map, + const ProcessorConfig& initial +) { + auto iter = config_map.find("processor_config"); + ProcessorConfig extracted_config = config_map.end() != iter ? + iter->second.as() : initial; + using utils::read_anymap_param; + read_anymap_param(config_map, "patch_size", extracted_config.patch_size); + read_anymap_param(config_map, "scale_resolution", extracted_config.scale_resolution); + read_anymap_param(config_map, "max_slice_nums", extracted_config.max_slice_nums); + read_anymap_param(config_map, "norm_mean", extracted_config.norm_mean); + read_anymap_param(config_map, "norm_std", extracted_config.norm_std); + return extracted_config; +} + /** * Split config by core and compile configs * There are not supported by `core.compile` function plugin options like `ENABLE_MMAP` diff --git a/src/cpp/src/utils.hpp b/src/cpp/src/utils.hpp index 136b873509..c149bb308f 100644 --- a/src/cpp/src/utils.hpp +++ b/src/cpp/src/utils.hpp @@ -6,6 +6,7 @@ #include #include "openvino/genai/llm_pipeline.hpp" +#include "openvino/genai/processor_config.hpp" namespace ov { namespace genai { @@ -64,12 +65,25 @@ void read_anymap_param(const ov::AnyMap& config_map, const std::string& name, T& const std::string STREAMER_ARG_NAME = "streamer"; const std::string CONFIG_ARG_NAME = "generation_config"; -ov::genai::GenerationConfig from_config_json_if_exists(const std::filesystem::path& model_path); +template +Config from_config_json_if_exists(const std::filesystem::path& model_path, const char config_name[]="generation_config.json") { + auto config_file_path = model_path / config_name; + if (std::filesystem::exists(config_file_path)) { + return Config{(config_file_path).string()}; + } else { + return Config{}; + } +} ov::genai::StreamerVariant get_streamer_from_map(const ov::AnyMap& config_map); ov::genai::OptionalGenerationConfig get_config_from_map(const ov::AnyMap& config_map); +ProcessorConfig from_any_map( + const ov::AnyMap& config_map, + const ProcessorConfig& initial +); + std::pair split_core_complile_config(const ov::AnyMap& plugin_config); } // namespace utils diff --git a/src/cpp/src/vision_encoder.cpp b/src/cpp/src/vision_encoder.cpp new file mode 100644 index 0000000000..a35a5d8db7 --- /dev/null +++ b/src/cpp/src/vision_encoder.cpp @@ -0,0 +1,317 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include +#include "clip.hpp" +#include "utils.hpp" + +using namespace ov::genai; + +namespace { +int ensure_divide(int length, int patch_size) { + return std::max(static_cast(std::round(static_cast(length) / patch_size) * patch_size), patch_size); +} + +std::pair find_best_resize(std::pair original_size, int scale_resolution, int patch_size, bool allow_upscale=false) { + int width = original_size.first; + int height = original_size.second; + if ((width * height > scale_resolution * scale_resolution) || allow_upscale) { + float r = static_cast(width) / height; + height = static_cast(scale_resolution / std::sqrt(r)); + width = static_cast(height * r); + } + int best_width = ensure_divide(width, patch_size); + int best_height = ensure_divide(height, patch_size); + return std::make_pair(best_width, best_height); +} + +std::pair get_refine_size(std::pair original_size, std::pair grid, int scale_resolution, int patch_size, bool allow_upscale) { + int width, height; + std::tie(width, height) = original_size; + int grid_x, grid_y; + std::tie(grid_x, grid_y) = grid; + + int refine_width = ensure_divide(width, grid_x); + int refine_height = ensure_divide(height, grid_y); + + int grid_width = refine_width / grid_x; + int grid_height = refine_height / grid_y; + + auto best_grid_size = find_best_resize(std::make_pair(grid_width, grid_height), scale_resolution, patch_size, allow_upscale); + int best_grid_width, best_grid_height; + std::tie(best_grid_width, best_grid_height) = best_grid_size; + + std::pair refine_size = std::make_pair(best_grid_width * grid_x, best_grid_height * grid_y); + return refine_size; +} + +std::vector> slice_image(const clip_image_u8& img, const int max_slice_nums, const int scale_resolution, const int patch_size, const bool never_split) { + const std::pair original_size{img.nx, img.ny}; + const int original_width = img.nx; + const int original_height = img.ny; + const float log_ratio = log(1.0f * original_width / original_height); + const float ratio = 1.0f * original_width * original_height / (scale_resolution * scale_resolution); + const int multiple = std::min(int(ceil(ratio)), max_slice_nums); + + std::vector> images; + images.push_back(std::vector{}); + + if (multiple <= 1) { + auto best_size = find_best_resize(original_size, scale_resolution, patch_size, true); + images.back().push_back(clip_image_u8{}); + bicubic_resize(img, images.back().back(), best_size.first, best_size.second); + } + else if (multiple > 1) { + + std::vector candidate_split_grids_nums; + for (int i : {multiple - 1, multiple, multiple + 1}) { + if (i == 1 || i > max_slice_nums) { + continue; + } + candidate_split_grids_nums.push_back(i); + } + + auto best_size = find_best_resize(original_size, scale_resolution, patch_size); + images.back().push_back(clip_image_u8{}); + bicubic_resize(img, images.back().back(), best_size.first, best_size.second); + + std::vector> candidate_grids; + + for (int split_grids_nums : candidate_split_grids_nums) { + int m = 1; + while (m <= split_grids_nums) { + if (split_grids_nums % m == 0) { + candidate_grids.emplace_back(m, split_grids_nums / m); + } + ++m; + } + } + + std::pair best_grid{ 1, 1 }; + float min_error = std::numeric_limits::infinity(); + + for (const auto& grid : candidate_grids) { + float error = std::abs(log_ratio - std::log(1.0f * grid.first / grid.second)); + if (error < min_error) { + best_grid = grid; + min_error = error; + } + } + auto refine_size = get_refine_size(original_size, best_grid, scale_resolution, patch_size, true); + clip_image_u8 refine_image; + bicubic_resize(img, refine_image, refine_size.first, refine_size.second); + + // split_to_patches + int width = refine_image.nx; + int height = refine_image.ny; + int grid_x = int(width / best_grid.first); + int grid_y = int(height / best_grid.second); + for (int patches_i = 0, ic = 0; patches_i < height && ic < best_grid.second; patches_i += grid_y, ic += 1) { + images.push_back(std::vector{}); + for (int patches_j = 0, jc = 0; patches_j < width && jc < best_grid.first; patches_j += grid_x, jc += 1) { + images.back().push_back(clip_image_u8{}); + clip_image_u8& patch = images.back().back(); + patch.nx = grid_x; + patch.ny = grid_y; + patch.buf.resize(3 * patch.nx * patch.ny); + for (int y = patches_i; y < patches_i + grid_y; ++y) { + for (int x = patches_j; x < patches_j + grid_x; ++x) { + const int i = 3 * (y * refine_image.nx + x); + const int j = 3 * ((y - patches_i) * patch.nx + (x - patches_j)); + patch.buf[j] = refine_image.buf[i]; + patch.buf[j + 1] = refine_image.buf[i + 1]; + patch.buf[j + 2] = refine_image.buf[i + 2]; + } + } + } + } + } + + return images; +} + +// Reimplemented https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html#torch.nn.Unfold +// in shape [NCHW], out shape: [N, C*kernel*kernel, H*W/kernel/kernel] +ov::Tensor unfold(const ov::Tensor& images_tensor, size_t kernel) { + ov::Shape images_shape = images_tensor.get_shape(); + + OPENVINO_ASSERT(4 == images_shape.size(), "Input tensor must be 4D (NCHW)."); + + const size_t bs = images_shape.at(0); + const size_t images_c = images_shape.at(1); + const size_t images_h = images_shape.at(2); + const size_t images_w = images_shape.at(3); + + OPENVINO_ASSERT(images_h >= kernel && images_w >= kernel, "Input height and width must be greater than or equal to kernel size."); + + const size_t new_c = images_c * kernel * kernel; + const size_t output_h = (images_h - kernel) / kernel + 1; + const size_t output_w = (images_w - kernel) / kernel + 1; + const size_t kernels_per_plane = output_h * output_w; + + ov::Tensor unfolded_tensor(ov::element::f32, {bs, new_c, kernels_per_plane}); + const float* images = images_tensor.data(); + float* unfolded = unfolded_tensor.data(); + for (size_t batch_idx = 0; batch_idx < bs; ++batch_idx) { + for (size_t c_idx = 0; c_idx < images_c; ++c_idx) { + for (size_t h_out = 0; h_out < output_h; ++h_out) { + for (size_t w_out = 0; w_out < output_w; ++w_out) { + size_t h_idx = h_out * kernel; // Calculate input height index + size_t w_idx = w_out * kernel; // Calculate input width index + + for (size_t kh = 0; kh < kernel; ++kh) { + for (size_t kw = 0; kw < kernel; ++kw) { + size_t input_idx = (batch_idx * images_c * images_h * images_w) + + (c_idx * images_h * images_w) + + ((h_idx + kh) * images_w) + + (w_idx + kw); + + size_t unfolded_c_idx = (c_idx * kernel * kernel) + (kh * kernel) + kw; + size_t unfolded_idx = (batch_idx * new_c * kernels_per_plane) + + unfolded_c_idx * kernels_per_plane + + (h_out * output_w + w_out); + + unfolded[unfolded_idx] = images[input_idx]; + } + } + } + } + } + } + return unfolded_tensor; +} + +ov::Tensor preprocess_for_encoder(const ov::Tensor& images, size_t kernel) { + ov::Shape images_shape = images.get_shape(); + OPENVINO_ASSERT(4 == images_shape.size()); + ov::Tensor unfolded_tensor = unfold(images, kernel); + const ov::Shape& unfolded_shape = unfolded_tensor.get_shape(); // [N, C*kernel*kernel, H*W/kernel/kernel] + const size_t bs = unfolded_shape[0]; + const size_t d1 = unfolded_shape[1]; + const size_t d2 = unfolded_shape[2]; + const size_t channels = 3; + const size_t new_len = d2 * kernel; + + ov::Tensor permuted_tensor{ov::element::f32, {bs, channels, kernel, new_len}}; + const float* unfolded = unfolded_tensor.data(); + float* permuted = permuted_tensor.data(); + for (size_t b_idx = 0; b_idx < bs; ++b_idx) { + for (size_t c_idx = 0; c_idx < channels; ++c_idx) { + for (size_t k1_idx = 0; k1_idx < kernel; ++k1_idx) { + for (size_t d2_idx = 0; d2_idx < d2; ++d2_idx) { + for (size_t k2_idx = 0; k2_idx < kernel; ++k2_idx) { + size_t unfolded_idx = b_idx * d1 * d2 + + (c_idx * kernel * kernel + k1_idx * kernel + k2_idx) * d2 + + d2_idx; + size_t permuted_idx = b_idx * channels * kernel * new_len + + c_idx * kernel * new_len + + k1_idx * new_len + + d2_idx * kernel + k2_idx; + permuted[permuted_idx] = unfolded[unfolded_idx]; + } + } + } + } + } + return permuted_tensor; +} + +EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const ov::Tensor& img, ov::InferRequest& encoder, int max_slice_nums, int scale_resolution, size_t patch_size, bool never_split) { + clip_image_u8 source{ + int(img.get_shape().at(3)), + int(img.get_shape().at(2)), + {img.data(), img.data() + img.get_size()} + }; + std::vector> imgs = ::slice_image(source, max_slice_nums, scale_resolution, patch_size, never_split); + std::vector> results; + std::vector> sizes; + + // std::vector img_res_v; // format N x H x W x RGB (N x 336 x 336 x 3), so interleaved RGB - different to the python implementation which is N x 3 x 336 x 336 + std::vector> preprocessed{imgs.size()}; + std::transform(imgs.begin(), imgs.end(), preprocessed.begin(), [&ctx_clip](const std::vector& row) { + std::vector processed_row{row.size()}; + std::transform(row.begin(), row.end(), processed_row.begin(), [&ctx_clip](const clip_image_u8& raw) { + return clip_image_preprocess(ctx_clip, raw); + }); + return processed_row; + }); + + const clip_image_f32& resized_preprocessed = preprocessed.at(0).at(0); + HeightWidth resized_source_size{resized_preprocessed.ny / patch_size, resized_preprocessed.nx / patch_size}; + ov::Tensor input_tensor{ov::element::f32, {1, 3, size_t(resized_preprocessed.ny), size_t(resized_preprocessed.nx)}, (void*)(resized_preprocessed.buf.data())}; + ov::Tensor pixel_values = preprocess_for_encoder(input_tensor, patch_size); + encoder.set_tensor("pixel_values", pixel_values); + ov::Tensor patch_attention_mask{ov::element::boolean, {pixel_values.get_shape().at(0), 1, resized_source_size.height * resized_source_size.width}}; + std::fill_n(patch_attention_mask.data(), patch_attention_mask.get_size(), true); + encoder.set_tensor("patch_attention_mask", patch_attention_mask); + ov::Tensor tgt_sizes{ov::element::i64, {1, 2}}; + int64_t* tgt_sizes_data = tgt_sizes.data(); + tgt_sizes_data[0] = resized_source_size.height; + tgt_sizes_data[1] = resized_source_size.width; + encoder.set_tensor("tgt_sizes", tgt_sizes); + encoder.infer(); + const ov::Tensor& output_tensor = encoder.get_output_tensor(); + ov::Tensor resized_source{output_tensor.get_element_type(), output_tensor.get_shape()}; + output_tensor.copy_to(resized_source); + + if (1 == preprocessed.size()) { + return {std::move(resized_source), resized_source_size}; + } + + HeightWidth size{ + size_t(preprocessed.at(1).at(0).ny), + size_t(preprocessed.at(1).at(0).nx) + }; + std::vector sliced_sizes; + size_t n_patches = size.height / patch_size * size.width / patch_size, + old_hidden_size = resized_source.get_shape().at(2); + ov::Tensor encoded_slices{ov::element::f32, {preprocessed.size() - 1, preprocessed.at(1).size(), n_patches, old_hidden_size}}; + // там внутри есть какая-то операция которая констант фолдит батч и из-за этого нельзя использовать отличный от того что был при экспорте + // констант фолдит она его в торч скрипте + // Even though batch can't be used, it's still possible to use async. + for (size_t row = 1; row < preprocessed.size(); ++row) { + for (size_t col = 0; col < preprocessed.at(row).size(); ++col) { + clip_image_f32& elem = preprocessed.at(row).at(col); + sliced_sizes.push_back({elem.ny / patch_size, elem.nx / patch_size}); + encoder.set_tensor("pixel_values", preprocess_for_encoder( + {ov::element::f32, {1, 3, size_t(elem.ny), size_t(elem.nx)}, elem.buf.data()}, + patch_size + )); + ov::Tensor patch_attention_mask{ov::element::boolean, {1, 1, sliced_sizes.back().height * sliced_sizes.back().width}}; + std::fill_n(patch_attention_mask.data(), patch_attention_mask.get_size(), true); + encoder.set_tensor("patch_attention_mask", patch_attention_mask); + ov::Tensor tgt_sizes{ov::element::i64, {1, 2}}; + int64_t* tgt_sizes_data = tgt_sizes.data(); + tgt_sizes_data[0] = sliced_sizes.back().height; + tgt_sizes_data[1] = sliced_sizes.back().width; + encoder.set_tensor("tgt_sizes", tgt_sizes); + encoder.set_output_tensor({ov::element::f32, {1, n_patches, old_hidden_size}, encoded_slices.data() + ((row - 1) * preprocessed.at(row).size() + col) * n_patches * old_hidden_size}); + encoder.infer(); + } + } + return {resized_source, resized_source_size, encoded_slices, sliced_sizes}; +} +} + +VisionEncoder::VisionEncoder(const std::filesystem::path& model_dir, const std::string& device, const ov::AnyMap device_config, ov::Core core) : + VisionEncoder{ + core.compile_model( + model_dir / "image_encoder.xml", device, device_config + ).create_infer_request(), + ov::genai::utils::from_config_json_if_exists( + model_dir, "preprocessor_config.json" + ) + } {} + +EncodedImage VisionEncoder::encode(const ov::Tensor& image, const ProcessorConfig& config) { + clip_ctx ctx_clip; + std::copy(config.norm_mean.begin(), config.norm_mean.end(), ctx_clip.image_mean); + std::copy(config.norm_std.begin(), config.norm_std.end(), ctx_clip.image_std); + return llava_image_embed_make_with_bytes_slice(ctx_clip, image, m_encoder, config.max_slice_nums, config.scale_resolution, config.patch_size, 0 == config.max_slice_nums); +} + +EncodedImage VisionEncoder::encode(const ov::Tensor& image, const ov::AnyMap& config_map) { + return encode(image, utils::from_any_map( + config_map, m_processor_config + )); +} diff --git a/src/cpp/src/vlm_config.cpp b/src/cpp/src/vlm_config.cpp new file mode 100644 index 0000000000..36d997ecbe --- /dev/null +++ b/src/cpp/src/vlm_config.cpp @@ -0,0 +1,17 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "openvino/genai/vlm_config.hpp" +#include "utils.hpp" +#include + +ov::genai::VLMConfig::VLMConfig(const std::filesystem::path& json_path) { + std::ifstream stream(json_path); + OPENVINO_ASSERT(stream.is_open(), "Failed to open '" + json_path.string() + "' with processor config"); + nlohmann::json parsed = nlohmann::json::parse(stream); + using ov::genai::utils::read_json_param; + read_json_param(parsed, "hidden_size", hidden_size); + read_json_param(parsed, "scale_emb", scale_emb); + read_json_param(parsed, "query_num", query_num); + read_json_param(parsed, "use_image_id", use_image_id); +} diff --git a/src/cpp/src/vlm_pipeline.cpp b/src/cpp/src/vlm_pipeline.cpp new file mode 100644 index 0000000000..89eb535aa7 --- /dev/null +++ b/src/cpp/src/vlm_pipeline.cpp @@ -0,0 +1,588 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "openvino/genai/vlm_pipeline.hpp" +#include "openvino/genai/tokenizer.hpp" +#include "vlm_sampling.hpp" +#include "clip.hpp" +#include +#include "../src/text_callback_streamer.hpp" +#include "utils.hpp" +#include +#include + +using namespace ov::genai; + +namespace { +template struct overloaded : Ts... {using Ts::operator()...;}; +template overloaded(Ts...) -> overloaded; + +constexpr size_t BATCH_SIZE = 1; + +struct Args { + bool do_sample = false; + int top_k = 0; + float top_p = 0.7f; + float temp = 0.95f; + float repeat_penalty = 1.0f; +}; + +int64_t get_out_token_id(const std::vector& input_ids, float* logits, size_t vocab_size, Args args) { + int64_t out_token; + + // logits pre-process + if (args.repeat_penalty != 1.f) { + sampling_repetition_penalty(logits, logits + vocab_size, input_ids, args.repeat_penalty); + } + + if (args.do_sample) + { + if (args.temp > 0) { + sampling_temperature(logits, logits + vocab_size, args.temp); + } + + std::vector token_scores(vocab_size); + for (int i = 0; i < vocab_size; i++) { + token_scores[i] = TokenIdScore(i, logits[i]); + } + + // top_k sampling + if (0 < args.top_k && args.top_k < (int)token_scores.size()) { + sampling_top_k(token_scores.data(), token_scores.data() + args.top_k, + token_scores.data() + token_scores.size()); + token_scores.resize(args.top_k); + } + + // top_p sampling + if (0.f < args.top_p && args.top_p < 1.f) { + auto pos = sampling_top_p(token_scores.data(), token_scores.data() + token_scores.size(), args.top_p); + token_scores.resize(pos - token_scores.data()); + } + + // sample next token + sampling_softmax_inplace(token_scores.data(), token_scores.data() + token_scores.size()); + for (size_t i = 0; i < token_scores.size(); i++) { + logits[i] = token_scores[i].score; + } + + thread_local std::random_device rd; + thread_local std::mt19937 gen(rd()); + + std::discrete_distribution<> dist(logits, logits + token_scores.size()); + out_token = token_scores[dist(gen)].id; + } + else { + out_token = std::max_element(logits, logits + vocab_size) - logits; + } + + return out_token; +} + +ov::Tensor process_prompt(ov::InferRequest& embedding, const ov::Tensor& prompt, float scale_emb) { + embedding.set_input_tensor(prompt); + embedding.infer(); + + const ov::Tensor& embed_output_tensor = embedding.get_output_tensor(); + + ov::Shape out_shape = embed_output_tensor.get_shape(); + float* data = embed_output_tensor.data(); + + //embedding * scale_emb + for (size_t idx = 0; idx < embed_output_tensor.get_size(); idx++) { + data[idx] = data[idx] * scale_emb; + } + return embed_output_tensor; +} + +ov::Tensor concatenate(const ov::Tensor& first, const ov::Tensor& second) { + size_t res_d_0 = first.get_shape().at(0); + size_t res_d_1 = first.get_shape().at(1); + OPENVINO_ASSERT(second.get_shape().at(0) == res_d_0); + OPENVINO_ASSERT(second.get_shape().at(1) == res_d_1); + size_t res_d_2 = first.get_shape().at(2) + second.get_shape().at(2); + ov::Tensor res{first.get_element_type(), {res_d_0, res_d_1, res_d_2}}; + float* first_data = first.data(); + float* second_data = second.data(); + float* res_data = res.data(); + for (size_t i = 0; i < res_d_0; ++i) { + for (size_t j = 0; j < res_d_1; ++j) { + size_t k = 0; + for (; k < first.get_shape().at(2); ++k) { + res_data[i * res_d_1 * res_d_2 + j * res_d_2 + k] + = first_data[i * res_d_1 * first.get_shape().at(2) + j * first.get_shape().at(2) + k]; + } + for (size_t l = 0; l < second.get_shape().at(2); ++l, ++k) { + res_data[i * res_d_1 * res_d_2 + j * res_d_2 + k] + = second_data[i * res_d_1 * second.get_shape().at(2) + j * second.get_shape().at(2) + l]; + } + } + } + return res; +} + +ov::Tensor concatenate_mid_dim(const ov::Tensor& first, const ov::Tensor& second) { + size_t res_d_0 = first.get_shape().at(0); + size_t res_d_2 = first.get_shape().at(2); + OPENVINO_ASSERT(second.get_shape().at(0) == res_d_0); + OPENVINO_ASSERT(second.get_shape().at(2) == res_d_2); + size_t res_d_1 = first.get_shape().at(1) + second.get_shape().at(1); + ov::Tensor res{first.get_element_type(), {res_d_0, res_d_1, res_d_2}}; + float* first_data = first.data(); + float* second_data = second.data(); + float* res_data = res.data(); + for (size_t i = 0; i < res_d_0; ++i) { + size_t j = 0; + for (; j < first.get_shape().at(1); ++j) { + std::copy_n( + first_data + i * first.get_shape().at(1) * res_d_2 + j * res_d_2, + res_d_2, + res_data + i * res_d_1 * res_d_2 + j * res_d_2 + ); + } + for (size_t k = 0; k < second.get_shape().at(1); ++k, ++j) { + std::copy_n( + second_data + i * second.get_shape().at(1) * res_d_2 + k * res_d_2, + res_d_2, + res_data + i * res_d_1 * res_d_2 + j * res_d_2 + ); + } + } + return res; +} + +/// embed_dim: output dimension for each position +/// pos: a list of positions to be encoded: size (H, W) +/// out: (H, W, D) +ov::Tensor get_1d_sincos_pos_embed_from_grid_new(size_t embed_dim, const ov::Tensor& pos) { + OPENVINO_ASSERT(embed_dim % 2 == 0); + OPENVINO_ASSERT(pos.get_shape().size() == 3); + OPENVINO_ASSERT(pos.get_shape().at(0) == 1); + size_t d0 = pos.get_shape().at(1); + size_t d1 = pos.get_shape().at(2); + size_t d2 = embed_dim / 2; + std::vector omega(d2); + for (size_t idx = 0; idx < omega.size(); ++idx) { + omega.at(idx) = idx / (embed_dim / 2.0f); + omega.at(idx) = 1.0f / std::pow(10000.0f, omega.at(idx)); // (D/2,) + } + const float* const pos_data = pos.data(); + ov::Tensor out(ov::element::f32, {d0, d1, d2}); // (H, W, D/2), outer product + float* out_data = out.data(); + for (size_t i = 0; i < d0; ++i) { + for (size_t j = 0; j < d1; ++j) { + for (size_t k = 0; k < d2; ++k) { + out_data[i * d1 * d2 + j * d2 + k] + = pos_data[i * d1 + j] * omega[k]; + } + } + } + + ov::Tensor emb_sin{out.get_element_type(), out.get_shape()}; // (H, W, D/2) + float* emb_sin_data = emb_sin.data(); + std::transform(out_data, out_data + out.get_size(), emb_sin_data, [](float arg) { + return std::sin(arg); + }); + ov::Tensor emb_cos{out.get_element_type(), out.get_shape()}; // (H, W, D/2) + float* emb_cos_data = emb_cos.data(); + std::transform(out_data, out_data + out.get_size(), emb_cos_data, [](float arg) { + return std::cos(arg); + }); + return concatenate(emb_sin, emb_cos); // (H, W, D) +} + +ov::Tensor get_2d_sincos_pos_embed_from_grid(size_t embed_dim, const ov::Tensor& grid) { + OPENVINO_ASSERT(embed_dim % 2 == 0); + // use half of dimensions to encode grid_h + ov::Coordinate begin_h{0, 0, 0}; + ov::Coordinate end_h{grid.get_shape()}; + end_h.at(0) = 1; + ov::Coordinate begin_w{1, 0, 0}; + ov::Coordinate end_w{grid.get_shape()}; + end_w.at(0) = 2; + ov::Tensor emb_h = get_1d_sincos_pos_embed_from_grid_new(embed_dim / 2, ov::Tensor{grid, begin_h, end_h}); // (H, W, D/2) + ov::Tensor emb_w = get_1d_sincos_pos_embed_from_grid_new(embed_dim / 2, ov::Tensor{grid, begin_w, end_w}); // (H, W, D/2) + return concatenate(emb_h, emb_w); +} + +/// image_size: image_size or (image_height, image_width) +/// return: +/// pos_embed: [image_height, image_width, embed_dim] +ov::Tensor get_2d_sincos_pos_embed(size_t embed_dim, const HeightWidth& image_size) { + size_t grid_h_size = image_size.height, grid_w_size = image_size.width; + ov::Tensor grid(ov::element::f32, {2, grid_h_size, grid_w_size}); + float* data = grid.data(); + for (size_t y = 0; y < grid_h_size; ++y) { + std::iota(data, data + grid_w_size, 0.0f); + data += grid_w_size; + } + for (float y = 0.0f; y < grid_h_size; ++y) { + std::fill(data, data + grid_w_size, y); + data += grid_w_size; + } + return get_2d_sincos_pos_embed_from_grid(embed_dim, grid); +} + +void adjust_pos_cache( + const std::vector& target_sizes, + size_t hidden_size, + ov::Tensor& pos_embed_cache +) { + size_t max_h = std::max_element(target_sizes.begin(), target_sizes.end(), [](const HeightWidth& left, const HeightWidth& right) { + return left.height < right.height; + })->height; + size_t max_w = std::max_element(target_sizes.begin(), target_sizes.end(), [](const HeightWidth& left, const HeightWidth& right) { + return left.width < right.width; + })->width; + size_t allocated_height, allocated_width; + if (pos_embed_cache) { + const ov::Shape& allocated_shape = pos_embed_cache.get_shape(); + allocated_height = allocated_shape.at(0); + allocated_width = allocated_shape.at(1); + } else { + allocated_height = allocated_width = 70; + } + if (max_h > allocated_height || max_w > allocated_width) { + allocated_height = std::max(max_h, allocated_height); + allocated_width = std::max(max_w, allocated_width); + pos_embed_cache = get_2d_sincos_pos_embed( + hidden_size, {allocated_height, allocated_width} + ); + } +} + +ov::Tensor resample(VLMPipeline& pipe, const ov::Tensor& encoded_image, const std::vector& target_sizes) { + size_t bs = encoded_image.get_shape().at(0); + std::vector patch_len{target_sizes.size()}; + std::transform(target_sizes.begin(), target_sizes.end(), patch_len.begin(), [](const HeightWidth& height_width) { + return height_width.height * height_width.width; + }); + adjust_pos_cache( + target_sizes, + pipe.m_vlm_config.hidden_size, + pipe.m_pos_embed_cache + ); + size_t max_patch_len = *std::max_element(patch_len.begin(), patch_len.end()); + ov::Tensor key_padding_mask(ov::element::boolean, {bs, max_patch_len}); + bool* mask_data = key_padding_mask.data(); + size_t embed_len = pipe.m_pos_embed_cache.get_shape().at(2); + ov::Tensor pos_embed(ov::element::f32, {max_patch_len, bs, embed_len}); // BLD => L * B * D + float* pos_embed_data = pos_embed.data(); + float* cache_data = pipe.m_pos_embed_cache.data(); + size_t _d0 = pipe.m_pos_embed_cache.get_shape().at(0); + size_t _d1 = pipe.m_pos_embed_cache.get_shape().at(1); + for (size_t i = 0; i < bs; ++i) { + size_t target_h = target_sizes.at(i).height; + size_t target_w = target_sizes.at(i).width; + for (size_t h_idx = 0; h_idx < target_h; ++h_idx) { + for (size_t w_idx = 0; w_idx < target_w; ++w_idx) { + std::copy_n( + cache_data + h_idx * _d1 + w_idx, + embed_len, + pos_embed_data + (h_idx * target_w + w_idx) * bs * embed_len + i * embed_len + ); + } + } + for (size_t flat = target_h * target_w; flat < max_patch_len; ++flat) { + std::fill_n(pos_embed_data + flat * bs * embed_len + i * embed_len, embed_len, 0.0f); + } + std::fill_n(mask_data + i * max_patch_len, patch_len[i], false); + std::fill_n(mask_data + i * max_patch_len + patch_len[i], max_patch_len - patch_len[i], true); + } + pipe.m_resampler.set_tensor("x", encoded_image); // [N, H*W, old_hidden_size] + pipe.m_resampler.set_tensor("pos_embed", pos_embed); // [H*W, N, new_hidden_size] + pipe.m_resampler.set_tensor("key_padding_mask", key_padding_mask); // [N, H*W] + pipe.m_resampler.infer(); + return pipe.m_resampler.get_output_tensor(); // [N, query_num, new_hidden_size] +} +} + +class ov::genai::VLMPipeline::VLMPipelineImpl { +}; + +VLMPipeline::VLMPipeline( + const std::filesystem::path& model_dir, + const Tokenizer& tokenizer, + const std::string& device, + const ov::AnyMap device_config, + ov::Core core +) : + m_vlm_config{ + utils::from_config_json_if_exists( + model_dir, "config.json" + ) + }, + m_tokenizer{tokenizer}, + m_vision_encoder(model_dir, device, device_config, core), + m_resampler{core.compile_model( + model_dir / "resampler.xml", device, device_config + ).create_infer_request()}, + m_embedding{core.compile_model( + model_dir / "embed_tokens.xml", device, device_config + ).create_infer_request()}, + m_language{core.compile_model( + model_dir / "language_model.xml", device, device_config + ).create_infer_request()}, + m_pos_embed_cache{ + get_2d_sincos_pos_embed(m_vlm_config.hidden_size, {70, 70}) + }, + m_is_chat_conversation{false} { + m_language.get_tensor("attention_mask").set_shape({1, 0}); + } + +ov::genai::VLMPipeline::~VLMPipeline() = default; + +DecodedResults VLMPipeline::generate( + const std::string& prompt, + const std::vector& rgbs, + const GenerationConfig& generation_config, + const StreamerVariant& streamer +) { + std::string images_prompt; + EncodedImage embeds; + if (!rgbs.empty()) { + OPENVINO_ASSERT(1 == rgbs.size(), "TODO: Only a single image allowed"); + embeds = m_vision_encoder.encode(rgbs.at(0)); + if (m_vlm_config.use_image_id) { + images_prompt = m_vlm_config.im_id_start + std::to_string(image_id) + m_vlm_config.im_id_end; + ++image_id; + } + std::string unk64; + for (size_t idx = 0; idx < m_vlm_config.query_num; ++idx) { + unk64 += m_vlm_config.unk; + } + images_prompt += m_vlm_config.im_start + unk64 + m_vlm_config.im_end; + if (embeds.slices) { + ov::Shape slices_shape = embeds.slices.get_shape(); + for (size_t row_idx = 0; row_idx < slices_shape.at(0); ++row_idx) { + for (size_t col_idx = 0; col_idx < slices_shape.at(1); ++col_idx) { + images_prompt += m_vlm_config.slice_start + unk64 + m_vlm_config.slice_end; + } + images_prompt += '\n'; + } + } + if ('\n' != *(images_prompt.end() - 1)) { + // Image wasn't sliced, add \n to the end of image anyway. + // Strangely, \n isn't placed between . + images_prompt += '\n'; + } + } + images_prompt += prompt; + std::string new_templated_chat_history; + if (m_is_chat_conversation) { + // KV cache in model already contains prompts and answers from previous iterations. + // So only new prompt wrapped into chat template to be sent into model. Tokenizer always returns + // token_ids = {, ...}. So if tokenizer applies only to the new prompt, + // will be inserted on every iteration. + // So actual pipeline calculates input_ids for whole chat history + for whole chat history without the new prompt + // and takes only the difference between them. + // The chat history cannot be saved as already encoded tokens because generate call doesn't return token, but + // KV cache contains it. So we have to add it manually or get it by tokenization all chat history. + m_history.push_back({{"role", "user"}, {"content", images_prompt}}); + constexpr bool add_generation_prompt = true; + new_templated_chat_history = m_tokenizer.apply_chat_template(m_history, add_generation_prompt); + } + ov::Tensor special_tokens = m_tokenizer.encode( + m_vlm_config.im_start + + m_vlm_config.im_end + + m_vlm_config.slice_start + + m_vlm_config.slice_end + ).input_ids; + OPENVINO_ASSERT( + 4 == special_tokens.get_shape().at(1), + "Every special token must be represented with a single int." + ); + size_t im_start_id = special_tokens.data()[0]; + size_t im_end_id = special_tokens.data()[1]; + size_t slice_start_id = special_tokens.data()[2]; + size_t slice_end_id = special_tokens.data()[3]; + ov::Tensor input_ids = m_tokenizer.encode(new_templated_chat_history).input_ids; + m_embedding.set_input_tensor(input_ids); + m_embedding.infer(); + ov::Tensor inputs_embeds = m_embedding.get_output_tensor(); + OPENVINO_ASSERT( + m_vlm_config.hidden_size == inputs_embeds.get_shape().at(2), + "Unexpected embedding size" + ); + if (!rgbs.empty()) { + int64_t* ids = input_ids.data(); + const ov::Tensor& resampled_source = resample(*this, embeds.resized_source, {embeds.resized_source_size}); + float* emb = resampled_source.data(); + bool replacing = false; + for (size_t token_idx = 0; token_idx < inputs_embeds.get_shape().at(1); ++token_idx) { + if (im_start_id == ids[token_idx]) { + replacing = true; + } + if (replacing) { + std::copy_n(emb, resampled_source.get_size(), inputs_embeds.data() + token_idx * m_vlm_config.hidden_size); + token_idx += resampled_source.get_shape().at(1); + replacing = false; + break; + } + } + if (embeds.slices) { + size_t token_idx = 0; + const ov::Shape& slices_shape = embeds.slices.get_shape(); + const std::vector& sliced_sizes = embeds.slices_sizes; + for (size_t i = 0; i < slices_shape.at(0); ++i) { + for (size_t ja = 0; ja < slices_shape.at(1); ++ja) { + size_t d2 = slices_shape.at(2); + size_t d3 = slices_shape.at(3); + ov::Tensor encoded_view{ov::element::f32, {1, d2, d3}, embeds.slices.data() + (i * slices_shape.at(1) + ja) * d2 * d3}; + const ov::Tensor& vision_embed_tensor_i_j = resample(*this, encoded_view, {sliced_sizes.at(i * slices_shape.at(1) + ja)}); + for (; token_idx < inputs_embeds.get_shape().at(1); ++token_idx) { + if (slice_start_id == ids[token_idx]) { + replacing = true; + } + if (slice_end_id == ids[token_idx]) { + replacing = false; + break; + } + if (replacing) { + std::copy_n(vision_embed_tensor_i_j.data(), vision_embed_tensor_i_j.get_size(), inputs_embeds.data() + token_idx * m_vlm_config.hidden_size); + token_idx += vision_embed_tensor_i_j.get_shape().at(1); + replacing = false; + break; + } + } + } + } + } + } + m_language.set_tensor("inputs_embeds", inputs_embeds); + size_t history_len = m_language.get_tensor("attention_mask").get_shape().at(1); + m_language.get_tensor("attention_mask").set_shape({1, history_len + inputs_embeds.get_shape()[1]}); + std::fill_n(m_language.get_tensor("attention_mask").data(), m_language.get_tensor("attention_mask").get_size(), 1); + m_language.get_tensor("position_ids").set_shape({1, inputs_embeds.get_shape().at(1)}); + std::iota(m_language.get_tensor("position_ids").data(), m_language.get_tensor("position_ids").data() + m_language.get_tensor("position_ids").get_size(), history_len); + m_language.get_tensor("beam_idx").set_shape({ BATCH_SIZE }); + m_language.get_tensor("beam_idx").data()[0] = 0; + + m_language.infer(); + + ov::Shape logits_shape = m_language.get_tensor("logits").get_shape(); + auto attention_size = m_language.get_tensor("attention_mask").get_size(); + + int64_t sequence_len = m_language.get_tensor("logits").get_shape().at(1) - 1; + size_t vocab_size = m_language.get_tensor("logits").get_shape().back(); + float* logits = m_language.get_tensor("logits").data() + sequence_len * vocab_size; + int64_t out_token = std::max_element(logits, logits + vocab_size) - logits; + + m_language.get_tensor("inputs_embeds").set_shape({BATCH_SIZE, 1, m_vlm_config.hidden_size}); + m_language.get_tensor("position_ids").set_shape({ BATCH_SIZE, 1 }); + + m_embedding.get_input_tensor().set_shape({ 1, 1 }); + + int64_t eos_token_id = m_tokenizer.get_eos_token_id(); + std::shared_ptr streamer_ptr = std::visit(overloaded{ + [&m_tokenizer = m_tokenizer]( + const std::function& callback + ) -> std::shared_ptr { + return std::make_shared(m_tokenizer, callback); + }, + [](const std::shared_ptr& ptr) { + return ptr; + }, + [](std::monostate) { + return std::shared_ptr{nullptr}; + }, + }, streamer); + std::vector generated; + while (true) { //(out_token != eos_token_id) + m_embedding.get_input_tensor().data()[0] = out_token; + m_embedding.infer(); + const ov::Tensor& embed_prompt_tensor = m_embedding.get_output_tensor(); + float* embed_data = embed_prompt_tensor.data(); + for (auto idx = 0; idx < embed_prompt_tensor.get_size(); idx++) { + embed_data[idx] = embed_data[idx] * m_vlm_config.scale_emb; + } + + m_language.set_tensor("inputs_embeds", embed_prompt_tensor); + m_language.get_tensor("attention_mask").set_shape({ BATCH_SIZE, m_language.get_tensor("attention_mask").get_shape()[1] + 1 }); + std::fill_n(m_language.get_tensor("attention_mask").data(), m_language.get_tensor("attention_mask").get_size(), 1); + m_language.get_tensor("position_ids").data()[0] = int64_t(m_language.get_tensor("attention_mask").get_size() - 2); + + m_language.infer(); + + generated.push_back(out_token); + if (streamer_ptr && streamer_ptr->put(out_token)) { + break; + } + logits = m_language.get_tensor("logits").data(); + + out_token = std::max_element(logits, logits + vocab_size) - logits; + if (out_token == eos_token_id) { + break; + } + } + + if (streamer_ptr) { + streamer_ptr->end(); + } + + if (m_is_chat_conversation) { + // auto new_chat_tokens = m_tokenizer.encode(new_templated_chat_history); + // if (m_is_cache_empty) { + // encoded_input = new_chat_tokens; + // } else { + // auto prev_chat_tokens = m_tokenizer.encode(m_templated_chat_history); + // encoded_input = subtract_chat_tokenized_inputs(new_chat_tokens, prev_chat_tokens); + // } + // m_templated_chat_history = new_templated_chat_history; + } else { + for (auto& variable : m_language.query_state()) { + variable.reset(); + } + m_language.get_tensor("attention_mask").set_shape({1, 0}); + } + return {{m_tokenizer.decode(generated)}}; +} + +DecodedResults VLMPipeline::generate( + const std::string& prompt, + const ov::AnyMap& config_map +) { + auto image = config_map.find(ov::genai::image.name()); + ov::genai::OptionalGenerationConfig config_arg = utils::get_config_from_map(config_map); + GenerationConfig config = (config_arg.has_value()) ? *config_arg : get_generation_config(); + config.update_generation_config(config_map); + return generate( + prompt, + config_map.end() == image ? std::vector{} + : std::vector{image->second.as()}, + config, + utils::get_streamer_from_map(config_map) + ); +} + +void VLMPipeline::start_chat(const std::string& system_message) { + m_is_chat_conversation = true; + bool have_state = 0 != m_language.get_tensor("attention_mask").get_size(); + if (have_state) { + // Resetting state may be slow. + for (ov::VariableState& variable : m_language.query_state()) { + variable.reset(); + } + // Since if is already introduced, move all resetting here. + m_language.get_tensor("attention_mask").set_shape({1, 0}); + m_history.clear(); + m_templated_chat_history.clear(); + } + if (system_message.empty()) { + return; + } + m_history = {{{"role", "system"}, {"content", system_message}}}; + constexpr bool add_generation_prompt = false; + m_templated_chat_history = m_tokenizer.apply_chat_template(m_history, add_generation_prompt); +} + +void VLMPipeline::set_chat_template(const std::string& new_template) { + m_tokenizer.set_chat_template(new_template); +} + +GenerationConfig VLMPipeline::get_generation_config() const { + return m_generation_config; +} + +void VLMPipeline::set_generation_config(const GenerationConfig& new_config) { + m_generation_config = new_config; +} diff --git a/src/cpp/src/vlm_sampling.hpp b/src/cpp/src/vlm_sampling.hpp new file mode 100644 index 0000000000..b0a7d2341f --- /dev/null +++ b/src/cpp/src/vlm_sampling.hpp @@ -0,0 +1,96 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include +#include +#include +#include + +struct TokenIdScore { + int id; + float score; + + TokenIdScore() = default; + TokenIdScore(int id, float score) : id(id), score(score) {} + + bool operator<(const TokenIdScore& other) const { return score < other.score; } + bool operator>(const TokenIdScore& other) const { return score > other.score; } + + friend std::ostream& operator<<(std::ostream& os, const TokenIdScore& self) { + return os << "TokenIdScore(id=" << self.id << ", score=" << self.score << ")"; + } +}; + +void sampling_softmax_inplace(TokenIdScore* first, TokenIdScore* last) { + float max_score = std::max_element(first, last)->score; + float sum = 0.f; + for (TokenIdScore* p = first; p != last; p++) { + float s = std::exp(p->score - max_score); + p->score = s; + sum += s; + } + float inv_sum = 1.f / sum; + for (TokenIdScore* p = first; p != last; p++) { + p->score *= inv_sum; + } +} + +void sampling_top_k(TokenIdScore* first, TokenIdScore* kth, TokenIdScore* last) { + std::nth_element(first, kth, last, std::greater()); +} + +TokenIdScore* sampling_top_p(TokenIdScore* first, TokenIdScore* last, float top_p) { + // fast top_p in expected O(n) time complexity + sampling_softmax_inplace(first, last); + + while (first + 1 < last) { + const float pivot_score = (last - 1)->score; // use mid score? + TokenIdScore* mid = + std::partition(first, last - 1, [pivot_score](const TokenIdScore& x) { return x.score > pivot_score; }); + std::swap(*mid, *(last - 1)); + + const float prefix_sum = + std::accumulate(first, mid, 0.f, [](float sum, const TokenIdScore& x) { return sum + x.score; }); + if (prefix_sum >= top_p) { + last = mid; + } + else if (prefix_sum + mid->score < top_p) { + first = mid + 1; + top_p -= prefix_sum + mid->score; + } + else { + return mid + 1; + } + } + return last; +} + +void sampling_repetition_penalty(float* first, float* last, const std::vector& input_ids, + float penalty) { + if (penalty < 0) { + std::cout << "penalty must be a positive float, but got " << penalty; + return; + } + const float inv_penalty = 1.f / penalty; + const ptrdiff_t vocab_size = last - first; + std::vector occurrence(vocab_size, false); + for (const int id : input_ids) { + if (!occurrence[id]) { + first[id] *= (first[id] > 0) ? inv_penalty : penalty; + } + occurrence[id] = true; + } +} + +void sampling_temperature(float* first, float* last, float temp) { + const float inv_temp = 1.f / temp; + for (float* it = first; it != last; it++) { + *it *= inv_temp; + } +} + + + diff --git a/src/docs/SUPPORTED_MODELS.md b/src/docs/SUPPORTED_MODELS.md index 3eb2af17b4..1232a081dd 100644 --- a/src/docs/SUPPORTED_MODELS.md +++ b/src/docs/SUPPORTED_MODELS.md @@ -1,5 +1,7 @@ # OpenVINO™ GenAI: Supported Models +## Large language models + @@ -155,6 +157,27 @@ The pipeline can work with other similar topologies produced by `optimum-intel` > [!NOTE] > Models should belong to the same family and have the same tokenizers. +## Visual language models + +
    + + + + + + + + + + + + +
    ArchitectureModelsExample HuggingFace Models
    MiniCPM-V-2_6MiniCPMV + +
    + Some models may require access request submission on the Hugging Face page to be downloaded. If https://huggingface.co/ is down, the conversion step won't be able to download the models. From a5fb3a64c9c8329ccc93771524671d344dda7587 Mon Sep 17 00:00:00 2001 From: Vladimir Zlobin Date: Tue, 8 Oct 2024 18:01:17 +0400 Subject: [PATCH 15/42] Fix misprint (#929) --- samples/cpp/whisper_speech_recognition/README.md | 2 +- samples/python/whisper_speech_recognition/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/cpp/whisper_speech_recognition/README.md b/samples/cpp/whisper_speech_recognition/README.md index ab5a76c70a..fec5d9194f 100644 --- a/samples/cpp/whisper_speech_recognition/README.md +++ b/samples/cpp/whisper_speech_recognition/README.md @@ -23,7 +23,7 @@ Prepare audio file in wav format with sampling rate 16k Hz. Output: text transcription of `sample.wav` -Models can be downloaded from [OpenAI HiggingFace](https://huggingface.co/openai). +Models can be downloaded from [OpenAI HuggingFace](https://huggingface.co/openai). Supported Models: [openai/whisper-tiny](https://huggingface.co/openai/whisper-tiny) diff --git a/samples/python/whisper_speech_recognition/README.md b/samples/python/whisper_speech_recognition/README.md index ab5a76c70a..fec5d9194f 100644 --- a/samples/python/whisper_speech_recognition/README.md +++ b/samples/python/whisper_speech_recognition/README.md @@ -23,7 +23,7 @@ Prepare audio file in wav format with sampling rate 16k Hz. Output: text transcription of `sample.wav` -Models can be downloaded from [OpenAI HiggingFace](https://huggingface.co/openai). +Models can be downloaded from [OpenAI HuggingFace](https://huggingface.co/openai). Supported Models: [openai/whisper-tiny](https://huggingface.co/openai/whisper-tiny) From aa7bfd66f2c5c34dc69ddf1fcf4178b31e50a5b0 Mon Sep 17 00:00:00 2001 From: eaidova Date: Tue, 8 Oct 2024 19:11:27 +0400 Subject: [PATCH 16/42] fix cb llm bench for gpu, allow string config --- llm_bench/python/llm_bench_utils/model_utils.py | 12 +++++++++--- llm_bench/python/llm_bench_utils/ov_utils.py | 5 ++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/llm_bench/python/llm_bench_utils/model_utils.py b/llm_bench/python/llm_bench_utils/model_utils.py index b35d7be47b..2cf06da63c 100644 --- a/llm_bench/python/llm_bench_utils/model_utils.py +++ b/llm_bench/python/llm_bench_utils/model_utils.py @@ -204,11 +204,17 @@ def get_use_case(model_name_or_path): def get_config(config): - with open(config, 'r') as f: + if Path(config).is_file(): + with open(config, 'r') as f: + try: + ov_config = json.load(f) + except Exception: + raise RuntimeError(f'==Parse file:{config} failiure, json format is incorrect ==') + else: try: - ov_config = json.load(f) + ov_config = json.loads(config) except Exception: - raise RuntimeError(f'==Parse file:{config} failiure, json format is incorrect ==') + raise RuntimeError(f'==Parse config:{config} failiure, json format is incorrect ==') return ov_config diff --git a/llm_bench/python/llm_bench_utils/ov_utils.py b/llm_bench/python/llm_bench_utils/ov_utils.py index 1d66389086..da77f5da22 100644 --- a/llm_bench/python/llm_bench_utils/ov_utils.py +++ b/llm_bench/python/llm_bench_utils/ov_utils.py @@ -189,8 +189,11 @@ def create_genai_text_gen_model(model_path, device, ov_config, **kwargs): cb = kwargs.get("use_cb", False) if cb: log.info("Continuous Batching mode activated") + default_cb_config = {"cache_size": 1} + if "GPU" in device: + default_cb_config["block_size"] = 16 scheduler_config = openvino_genai.SchedulerConfig() - scheduler_params = kwargs.get("cb_config") or {"cache_size": 1} + scheduler_params = kwargs.get("cb_config") or default_cb_config if scheduler_params: log.info(f"Scheduler parameters:\n{scheduler_params}") From aaf731c9c0074a2647168ef2f104b8107d0e3e19 Mon Sep 17 00:00:00 2001 From: Ekaterina Aidova Date: Tue, 8 Oct 2024 19:27:45 +0400 Subject: [PATCH 17/42] fix linting issue in llm bench (#932) --- llm_bench/python/llm_bench_utils/model_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llm_bench/python/llm_bench_utils/model_utils.py b/llm_bench/python/llm_bench_utils/model_utils.py index 2cf06da63c..3d5359e26c 100644 --- a/llm_bench/python/llm_bench_utils/model_utils.py +++ b/llm_bench/python/llm_bench_utils/model_utils.py @@ -214,7 +214,7 @@ def get_config(config): try: ov_config = json.loads(config) except Exception: - raise RuntimeError(f'==Parse config:{config} failiure, json format is incorrect ==') + raise RuntimeError(f'==Parse config:{config} failiure, json format is incorrect ==') return ov_config From 14df316a516494575c971f8dd644d78048439f35 Mon Sep 17 00:00:00 2001 From: eaidova Date: Tue, 8 Oct 2024 20:10:59 +0400 Subject: [PATCH 18/42] disable md5 check assert for CB --- llm_bench/python/benchmark.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/llm_bench/python/benchmark.py b/llm_bench/python/benchmark.py index 7fb6d1757b..9dcfe74f66 100644 --- a/llm_bench/python/benchmark.py +++ b/llm_bench/python/benchmark.py @@ -308,13 +308,14 @@ def run_text_generation_genai(input_text, num, model, tokenizer, args, iter_data log.warning(f"[{num}] Prompt[{prompt_index}]'s md5 {result_md5_list} " f"is different from md5 of the {num - 1} iteration {prev_md5}") llm_bench_utils.metrics_print.print_generated(num, warm_up=(num == 0), generated=generated_text[0]) - if num == 1: - # if the device is CPU, throw exception - if args['devices'].lower().startswith('cpu') is True: + if not args.get("use_cb", False): + if num == 1: + # if the device is CPU, throw exception + if args['devices'].lower().startswith('cpu') is True: + assert (result_md5_list == prev_md5) + else: + # throw exception assert (result_md5_list == prev_md5) - else: - # throw exception - assert (result_md5_list == prev_md5) else: llm_bench_utils.metrics_print.print_generated(num, warm_up=(num == 0), generated=generated_text[0]) @@ -814,7 +815,7 @@ def get_argprser(): llm_bench_utils.model_utils.add_stateful_model_arguments(parser) parser.add_argument("--genai", action="store_true", help="Use OpenVINO GenAI optimized pipelines for benchmarking") parser.add_argument("--use_cb", action="store_true", help="Use Continuous Batching inference mode") - parser.add_argument("--cb_config", required=False, default=None, help="Path to file with Continuous Batching Scheduler settings") + parser.add_argument("--cb_config", required=False, default=None, help="Path to file with Continuous Batching Scheduler settings or dict") parser.add_argument( '--end_token_stopping', action='store_true', From 44657279a25cae3a297dd90a62d6f8ba0ef3ffe3 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 09:22:13 +0200 Subject: [PATCH 19/42] Use older MSVC toolchain version --- .github/workflows/causal_lm_cpp.yml | 6 ++++-- .github/workflows/lcm_dreamshaper_cpp.yml | 6 +++++- .github/workflows/stable_diffusion_1_5_cpp.yml | 6 +++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index 3feb7c8563..aea4d203a8 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -203,7 +203,6 @@ jobs: cpp-greedy_causal_lm-windows: runs-on: windows-latest - if: ${{ false }} # TODO: fix Windows env: PYTHONIOENCODING: "utf8" defaults: @@ -218,6 +217,8 @@ jobs: python-version: 3.9 - name: Configure Developer Command Prompt for Microsoft Visual C++ uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0 + with: + toolset: 14.29 - run: curl --output ov.zip ${{ env.w_ov_link }} - run: unzip -d ov ov.zip - run: dirs=(ov/*) && mv ov/*/* ov && rmdir "${dirs[@]}" @@ -757,7 +758,6 @@ jobs: cpp-continuous-batching-windows: runs-on: windows-latest - if: ${{ false }} # TODO: fix Windows env: PYTHONIOENCODING: "utf8" defaults: @@ -772,6 +772,8 @@ jobs: python-version: 3.9 - name: Configure Developer Command Prompt for Microsoft Visual C++ uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0 + with: + toolset: 14.29 - name: Install OpenVINO run: | curl --output ov.zip ${{ env.w_ov_link }} diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index 7997616c6e..229c2b8d04 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -71,7 +71,6 @@ jobs: lcm_dreamshaper_v7_cpp-windows: runs-on: windows-latest - if: ${{ false }} # TODO: fix Windows defaults: run: shell: pwsh @@ -89,6 +88,11 @@ jobs: mv ./tmp/*/* . popd + - name: Configure Developer Command Prompt for Microsoft Visual C++ + uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0 + with: + toolset: 14.29 + - name: Build app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 1f0e11851b..a16b29794d 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -80,7 +80,6 @@ jobs: stable_diffusion_1_5_cpp-windows: runs-on: windows-latest - if: ${{ false }} # TODO: fix Windows defaults: run: shell: pwsh @@ -98,6 +97,11 @@ jobs: mv ./tmp/*/* . popd + - name: Configure Developer Command Prompt for Microsoft Visual C++ + uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0 + with: + toolset: 14.29 + - name: Build app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" From 7f9a579695bbe7c68a46df1db36fdbffd8bfc740 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 09:48:20 +0200 Subject: [PATCH 20/42] Use OpenVINO runners --- .github/workflows/causal_lm_cpp.yml | 4 ++-- .github/workflows/lcm_dreamshaper_cpp.yml | 2 +- .github/workflows/stable_diffusion_1_5_cpp.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index aea4d203a8..f9ab5863f3 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -202,7 +202,7 @@ jobs: echo "Multi prompt" passed cpp-greedy_causal_lm-windows: - runs-on: windows-latest + runs-on: aks-win-16-cores-32gb env: PYTHONIOENCODING: "utf8" defaults: @@ -757,7 +757,7 @@ jobs: timeout 200s ./build/samples/cpp/continuous_batching_benchmark/continuous_batching_benchmark -n 10 --dynamic_split_fuse --max_batch_size 256 --max_input_len 256 -m ./TinyLlama-1.1B-Chat-v1.0/ --dataset ./ShareGPT_V3_unfiltered_cleaned_split.json --cache_size 1 cpp-continuous-batching-windows: - runs-on: windows-latest + runs-on: aks-win-16-cores-32gb env: PYTHONIOENCODING: "utf8" defaults: diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index 229c2b8d04..eb5e713770 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -70,7 +70,7 @@ jobs: ./build/samples/cpp/text2image/stable_diffusion ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" lcm_dreamshaper_v7_cpp-windows: - runs-on: windows-latest + runs-on: aks-win-16-cores-32gb defaults: run: shell: pwsh diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index a16b29794d..2352f19be8 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -79,7 +79,7 @@ jobs: ./build/samples/cpp/text2image/lora_stable_diffusion ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 stable_diffusion_1_5_cpp-windows: - runs-on: windows-latest + runs-on: aks-win-16-cores-32gb defaults: run: shell: pwsh From 9d1e7e3cf6e0c10d4da298d80be06b2dbf80d01e Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 12:41:17 +0400 Subject: [PATCH 21/42] Apply suggestions from code review --- .github/workflows/causal_lm_cpp.yml | 4 ++-- .github/workflows/lcm_dreamshaper_cpp.yml | 2 +- .github/workflows/stable_diffusion_1_5_cpp.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index f9ab5863f3..fe360985d2 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -202,7 +202,7 @@ jobs: echo "Multi prompt" passed cpp-greedy_causal_lm-windows: - runs-on: aks-win-16-cores-32gb + runs-on: windows-2019-16-core env: PYTHONIOENCODING: "utf8" defaults: @@ -757,7 +757,7 @@ jobs: timeout 200s ./build/samples/cpp/continuous_batching_benchmark/continuous_batching_benchmark -n 10 --dynamic_split_fuse --max_batch_size 256 --max_input_len 256 -m ./TinyLlama-1.1B-Chat-v1.0/ --dataset ./ShareGPT_V3_unfiltered_cleaned_split.json --cache_size 1 cpp-continuous-batching-windows: - runs-on: aks-win-16-cores-32gb + runs-on: windows-2019-16-core env: PYTHONIOENCODING: "utf8" defaults: diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index eb5e713770..4b8a3366e4 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -70,7 +70,7 @@ jobs: ./build/samples/cpp/text2image/stable_diffusion ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" lcm_dreamshaper_v7_cpp-windows: - runs-on: aks-win-16-cores-32gb + runs-on: windows-2019-16-core defaults: run: shell: pwsh diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 2352f19be8..46e68abbf1 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -79,7 +79,7 @@ jobs: ./build/samples/cpp/text2image/lora_stable_diffusion ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 stable_diffusion_1_5_cpp-windows: - runs-on: aks-win-16-cores-32gb + runs-on: windows-2019-16-core defaults: run: shell: pwsh From 2c56899144c8350294408f9b78b78077ce0f0d7e Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 15:53:40 +0200 Subject: [PATCH 22/42] Try to fix Windows --- .github/workflows/lcm_dreamshaper_cpp.yml | 2 +- .../workflows/stable_diffusion_1_5_cpp.yml | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index 4b8a3366e4..5f76ec893b 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -122,7 +122,7 @@ jobs: - name: Run app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - ./build/samples/cpp/text2image/Release/lcm_dreamshaper.exe ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + "./build/samples/cpp/text2image/Release/lcm_dreamshaper.exe" ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" Overall_Status: name: ci/gha_overall_status_lcm diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 46e68abbf1..f9cca1e46a 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -61,6 +61,7 @@ jobs: - name: Download and convert models and tokenizer run: | + wget -O ./models/soulcard.safetensors https://civitai.com/api/download/models/72591 source openvino_sd_cpp/bin/activate optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --weight-format fp16 --task stable-diffusion models/dreamlike-art-dreamlike-anime-1.0/FP16 @@ -69,10 +70,6 @@ jobs: source ${{ env.OV_INSTALL_DIR }}/setupvars.sh ./build/samples/cpp/text2image/stable_diffusion ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" - - name: Download LoRA adapter - run: | - wget -O ./models/soulcard.safetensors https://civitai.com/api/download/models/72591 - - name: Run LoRA app run: | source ${{ env.OV_INSTALL_DIR }}/setupvars.sh @@ -123,15 +120,21 @@ jobs: python -m pip install ./thirdparty/openvino_tokenizers/[transformers] --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly python -m pip install -r ./samples/requirements.txt --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly - - name: Download and convert models and tokenizer + # - name: Download and convert models and tokenizer + # run: | + # Invoke-WebRequest -Uri 'https://civitai.com/api/download/models/72591' -OutFile 'soulcard.safetensors' + # . "./openvino_sd_cpp/Scripts/Activate.ps1" + # optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --task stable-diffusion --weight-format fp16 models/dreamlike-art-dreamlike-anime-1.0/FP16 + + - name: Run main app run: | - . "./openvino_sd_cpp/Scripts/Activate.ps1" - optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --task stable-diffusion --weight-format fp16 models/dreamlike-art-dreamlike-anime-1.0/FP16 + . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" + "./build/samples/cpp/text2image/Release/stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" - - name: Run app + - name: Run LoRA app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - ./build/samples/cpp/text2image/Release/stable_diffusion.exe ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + "./build/samples/cpp/text2image/lora_stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 Overall_Status: name: ci/gha_overall_status_stable_diffusion From 4aa01ca3425516c2ad221a4c31149a6aae2cbd2f Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 15:56:41 +0200 Subject: [PATCH 23/42] Added & --- .github/workflows/lcm_dreamshaper_cpp.yml | 2 +- .github/workflows/stable_diffusion_1_5_cpp.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index 5f76ec893b..f4f3a48284 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -122,7 +122,7 @@ jobs: - name: Run app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - "./build/samples/cpp/text2image/Release/lcm_dreamshaper.exe" ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + & "./build/samples/cpp/text2image/Release/lcm_dreamshaper.exe" ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" Overall_Status: name: ci/gha_overall_status_lcm diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index f9cca1e46a..8d0722bdc9 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -129,12 +129,12 @@ jobs: - name: Run main app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - "./build/samples/cpp/text2image/Release/stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" - name: Run LoRA app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - "./build/samples/cpp/text2image/lora_stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 + & "./build/samples/cpp/text2image/lora_stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 Overall_Status: name: ci/gha_overall_status_stable_diffusion From 0afb553903efbe0a534087dd40423b78b5da44c8 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 20:00:31 +0400 Subject: [PATCH 24/42] Update stable_diffusion_1_5_cpp.yml --- .github/workflows/stable_diffusion_1_5_cpp.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 8d0722bdc9..9d9d06023e 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -120,11 +120,11 @@ jobs: python -m pip install ./thirdparty/openvino_tokenizers/[transformers] --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly python -m pip install -r ./samples/requirements.txt --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly - # - name: Download and convert models and tokenizer - # run: | - # Invoke-WebRequest -Uri 'https://civitai.com/api/download/models/72591' -OutFile 'soulcard.safetensors' - # . "./openvino_sd_cpp/Scripts/Activate.ps1" - # optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --task stable-diffusion --weight-format fp16 models/dreamlike-art-dreamlike-anime-1.0/FP16 + - name: Download and convert models and tokenizer + run: | + Invoke-WebRequest -Uri 'https://civitai.com/api/download/models/72591' -OutFile 'soulcard.safetensors' + . "./openvino_sd_cpp/Scripts/Activate.ps1" + optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --task stable-diffusion --weight-format fp16 models/dreamlike-art-dreamlike-anime-1.0/FP16 - name: Run main app run: | From 4ae6b1871e532807cdcfbc65cbf94650b629afc3 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 20:29:55 +0400 Subject: [PATCH 25/42] Update stable_diffusion_1_5_cpp.yml --- .github/workflows/stable_diffusion_1_5_cpp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 9d9d06023e..bb28031d68 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -61,9 +61,9 @@ jobs: - name: Download and convert models and tokenizer run: | - wget -O ./models/soulcard.safetensors https://civitai.com/api/download/models/72591 source openvino_sd_cpp/bin/activate optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --weight-format fp16 --task stable-diffusion models/dreamlike-art-dreamlike-anime-1.0/FP16 + wget -O ./models/soulcard.safetensors https://civitai.com/api/download/models/72591 - name: Run main app run: | @@ -122,9 +122,9 @@ jobs: - name: Download and convert models and tokenizer run: | - Invoke-WebRequest -Uri 'https://civitai.com/api/download/models/72591' -OutFile 'soulcard.safetensors' . "./openvino_sd_cpp/Scripts/Activate.ps1" optimum-cli export openvino --model dreamlike-art/dreamlike-anime-1.0 --task stable-diffusion --weight-format fp16 models/dreamlike-art-dreamlike-anime-1.0/FP16 + Invoke-WebRequest -Uri 'https://civitai.com/api/download/models/72591' -OutFile 'models/soulcard.safetensors' - name: Run main app run: | From 3e772fd272174c61c3b753ff6b73690f1b6d2029 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 20:30:33 +0400 Subject: [PATCH 26/42] Apply suggestions from code review --- .github/workflows/lcm_dreamshaper_cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index f4f3a48284..d9d2a9a3f8 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -122,7 +122,7 @@ jobs: - name: Run app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/lcm_dreamshaper.exe" ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" Overall_Status: name: ci/gha_overall_status_lcm From 0b55cd04039ffd9ad2a4c0de679c582e80b9d37b Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 20:31:05 +0400 Subject: [PATCH 27/42] Apply suggestions from code review --- .github/workflows/stable_diffusion_1_5_cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index bb28031d68..accc0f2e73 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -134,7 +134,7 @@ jobs: - name: Run LoRA app run: | . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/lora_stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 + & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 Overall_Status: name: ci/gha_overall_status_stable_diffusion From 22c573dcac2259a496eaa6e6fcae6ef86041482e Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 21:06:06 +0400 Subject: [PATCH 28/42] Apply suggestions from code review --- .github/workflows/stable_diffusion_1_5_cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index accc0f2e73..9077275b8d 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -127,7 +127,7 @@ jobs: Invoke-WebRequest -Uri 'https://civitai.com/api/download/models/72591' -OutFile 'models/soulcard.safetensors' - name: Run main app - run: | + run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" From fcd6670491ac1cfffde508cc4d0a3ed80c73091d Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 22:11:06 +0400 Subject: [PATCH 29/42] Apply suggestions from code review --- .github/workflows/lcm_dreamshaper_cpp.yml | 4 ++-- .github/workflows/stable_diffusion_1_5_cpp.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index d9d2a9a3f8..aa470dbd07 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -120,9 +120,9 @@ jobs: optimum-cli export openvino --model SimianLuo/LCM_Dreamshaper_v7 --task stable-diffusion --weight-format fp16 models/lcm_dreamshaper_v7/FP16 - name: Run app - run: | + run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" ./models/lcm_dreamshaper_v7/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" "./models/lcm_dreamshaper_v7/FP16" "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" Overall_Status: name: ci/gha_overall_status_lcm diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 9077275b8d..4bc3525fe4 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -129,10 +129,10 @@ jobs: - name: Run main app run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" "./models/dreamlike-art-dreamlike-anime-1.0/FP16" "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" - name: Run LoRA app - run: | + run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 From e7c1371f6eb8965391c3a3bad1c422bda9579d3b Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 22:11:39 +0400 Subject: [PATCH 30/42] Apply suggestions from code review --- .github/workflows/stable_diffusion_1_5_cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 4bc3525fe4..ad41afd809 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -134,7 +134,7 @@ jobs: - name: Run LoRA app run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe" ./models/dreamlike-art-dreamlike-anime-1.0/FP16 "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 + & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe" "./models/dreamlike-art-dreamlike-anime-1.0/FP16" "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 Overall_Status: name: ci/gha_overall_status_stable_diffusion From 78bbf622d5cf47cfbfd9b809a1164e4dcb19de33 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 22:12:09 +0400 Subject: [PATCH 31/42] Update .github/workflows/stable_diffusion_1_5_cpp.yml --- .github/workflows/stable_diffusion_1_5_cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index ad41afd809..942dd5f54e 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -134,7 +134,7 @@ jobs: - name: Run LoRA app run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe" "./models/dreamlike-art-dreamlike-anime-1.0/FP16" "curly-haired unicorn in the forest, anime, line" ./models/soulcard.safetensors 0.7 + & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe" "./models/dreamlike-art-dreamlike-anime-1.0/FP16" "curly-haired unicorn in the forest, anime, line" "./models/soulcard.safetensors" 0.7 Overall_Status: name: ci/gha_overall_status_stable_diffusion From 581e2c1f231b575866da4d125dddcacfc0d9cef8 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 22:40:11 +0400 Subject: [PATCH 32/42] Apply suggestions from code review --- .github/workflows/lcm_dreamshaper_cpp.yml | 2 +- .github/workflows/stable_diffusion_1_5_cpp.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lcm_dreamshaper_cpp.yml b/.github/workflows/lcm_dreamshaper_cpp.yml index aa470dbd07..a5c057a0ab 100644 --- a/.github/workflows/lcm_dreamshaper_cpp.yml +++ b/.github/workflows/lcm_dreamshaper_cpp.yml @@ -122,7 +122,7 @@ jobs: - name: Run app run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" "./models/lcm_dreamshaper_v7/FP16" "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + & "./build/samples/cpp/text2image/Release/stable_diffusion.exe ./models/lcm_dreamshaper_v7/FP16 'cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting'" Overall_Status: name: ci/gha_overall_status_lcm diff --git a/.github/workflows/stable_diffusion_1_5_cpp.yml b/.github/workflows/stable_diffusion_1_5_cpp.yml index 942dd5f54e..ae6b7ce57b 100644 --- a/.github/workflows/stable_diffusion_1_5_cpp.yml +++ b/.github/workflows/stable_diffusion_1_5_cpp.yml @@ -129,12 +129,12 @@ jobs: - name: Run main app run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/stable_diffusion.exe" "./models/dreamlike-art-dreamlike-anime-1.0/FP16" "cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting" + & "./build/samples/cpp/text2image/Release/stable_diffusion.exe ./models/dreamlike-art-dreamlike-anime-1.0/FP16 'cyberpunk cityscape like Tokyo New York with tall buildings at dusk golden hour cinematic lighting'" - name: Run LoRA app run: > . "${{ env.OV_INSTALL_DIR }}/setupvars.ps1" - & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe" "./models/dreamlike-art-dreamlike-anime-1.0/FP16" "curly-haired unicorn in the forest, anime, line" "./models/soulcard.safetensors" 0.7 + & "./build/samples/cpp/text2image/Release/lora_stable_diffusion.exe ./models/dreamlike-art-dreamlike-anime-1.0/FP16 'curly-haired unicorn in the forest, anime, line' ./models/soulcard.safetensors 0.7" Overall_Status: name: ci/gha_overall_status_stable_diffusion From d43773ca2b283861f8be48fdc9149ef097f5bbd4 Mon Sep 17 00:00:00 2001 From: likholat Date: Fri, 27 Sep 2024 17:16:20 +0200 Subject: [PATCH 33/42] SDXL Pipeline, Euler Discrete scheduler --- .../genai/text2image/clip_text_model.hpp | 4 + .../clip_text_model_with_projection.hpp | 69 ++++ .../openvino/genai/text2image/pipeline.hpp | 18 +- src/cpp/src/text2image/diffusion_pipeline.hpp | 2 + .../src/text2image/models/clip_text_model.cpp | 4 + .../clip_text_model_with_projection.cpp | 108 ++++++ src/cpp/src/text2image/numpy_utils.cpp | 79 ++++ src/cpp/src/text2image/numpy_utils.hpp | 12 + src/cpp/src/text2image/schedulers/ddim.cpp | 43 +-- src/cpp/src/text2image/schedulers/ddim.hpp | 2 - .../text2image/schedulers/euler_discrete.cpp | 281 ++++++++++++++ .../text2image/schedulers/euler_discrete.hpp | 60 +++ .../src/text2image/schedulers/scheduler.cpp | 3 + src/cpp/src/text2image/schedulers/types.cpp | 46 +++ src/cpp/src/text2image/schedulers/types.hpp | 24 ++ .../stable_diffusion_xl_pipeline.hpp | 345 ++++++++++++++++++ .../src/text2image/text2image_pipeline.cpp | 22 +- 17 files changed, 1074 insertions(+), 48 deletions(-) create mode 100644 src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp create mode 100644 src/cpp/src/text2image/models/clip_text_model_with_projection.cpp create mode 100644 src/cpp/src/text2image/numpy_utils.cpp create mode 100644 src/cpp/src/text2image/schedulers/euler_discrete.cpp create mode 100644 src/cpp/src/text2image/schedulers/euler_discrete.hpp create mode 100644 src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp diff --git a/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp b/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp index 01bf6f6fdd..b7011207ca 100644 --- a/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp +++ b/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp @@ -58,6 +58,10 @@ class OPENVINO_GENAI_EXPORTS CLIPTextModel { ov::Tensor infer(const std::string& pos_prompt, const std::string& neg_prompt, bool do_classifier_free_guidance); + // ov::Tensor get_tensor(const std::string& output); + + ov::Tensor get_output_tensor(const size_t idx); + private: Config m_config; AdapterController m_adapter_controller; diff --git a/src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp b/src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp new file mode 100644 index 0000000000..5fb17aafa6 --- /dev/null +++ b/src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp @@ -0,0 +1,69 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include + +#include "openvino/genai/visibility.hpp" +#include "openvino/genai/tokenizer.hpp" + +#include "openvino/core/any.hpp" +#include "openvino/runtime/tensor.hpp" +#include "openvino/runtime/infer_request.hpp" +#include "openvino/runtime/properties.hpp" + +namespace ov { +namespace genai { + +class OPENVINO_GENAI_EXPORTS CLIPTextModelWithProjection { +public: + struct Config { + size_t max_position_embeddings = 77; + size_t hidden_size = 512; + + explicit Config(const std::string& config_path); + }; + + explicit CLIPTextModelWithProjection(const std::string root_dir); + + CLIPTextModelWithProjection(const std::string& root_dir, + const std::string& device, + const ov::AnyMap& properties = {}); + + template ::value, bool>::type = true> + CLIPTextModelWithProjection(const std::string& root_dir, + const std::string& device, + Properties&&... properties) + : CLIPTextModelWithProjection(root_dir, device, ov::AnyMap{std::forward(properties)...}) { } + + CLIPTextModelWithProjection(const CLIPTextModelWithProjection&); + + const Config& get_config() const; + + CLIPTextModelWithProjection& reshape(int batch_size); + + CLIPTextModelWithProjection& compile(const std::string& device, const ov::AnyMap& properties = {}); + + template + ov::util::EnableIfAllStringAny compile( + const std::string& device, + Properties&&... properties) { + return compile(device, ov::AnyMap{std::forward(properties)...}); + } + + ov::Tensor infer(const std::string& pos_prompt, const std::string& neg_prompt, bool do_classifier_free_guidance); + + ov::Tensor get_output_tensor(const size_t idx); + +private: + Config m_config; + ov::InferRequest m_request; + std::shared_ptr m_model; + + Tokenizer m_clip_tokenizer; +}; + +} // namespace genai +} // namespace ov diff --git a/src/cpp/include/openvino/genai/text2image/pipeline.hpp b/src/cpp/include/openvino/genai/text2image/pipeline.hpp index 1fa779cbb7..3a47ce3385 100644 --- a/src/cpp/include/openvino/genai/text2image/pipeline.hpp +++ b/src/cpp/include/openvino/genai/text2image/pipeline.hpp @@ -15,6 +15,7 @@ #include "openvino/genai/lora_adapter.hpp" #include "openvino/genai/text2image/clip_text_model.hpp" +#include "openvino/genai/text2image/clip_text_model_with_projection.hpp" #include "openvino/genai/text2image/unet2d_condition_model.hpp" #include "openvino/genai/text2image/autoencoder_kl.hpp" @@ -54,7 +55,8 @@ class OPENVINO_GENAI_EXPORTS Text2ImagePipeline { AUTO, LCM, LMS_DISCRETE, - DDIM + DDIM, + EULER_DISCRETE }; static std::shared_ptr from_config(const std::string& scheduler_config_path, @@ -108,15 +110,24 @@ class OPENVINO_GENAI_EXPORTS Text2ImagePipeline { // creates either LCM or SD pipeline from building blocks static Text2ImagePipeline stable_diffusion( + const std::shared_ptr& scheduler_type, // scheduler + const CLIPTextModel& clip_text_model, // text_encoder + const UNet2DConditionModel& unet, // unet + const AutoencoderKL& vae_decoder); // vae + + + // creates either LCM or SD pipeline from building blocks + static Text2ImagePipeline latent_consistency_model( const std::shared_ptr& scheduler_type, const CLIPTextModel& clip_text_model, const UNet2DConditionModel& unet, const AutoencoderKL& vae_decoder); - // creates either LCM or SD pipeline from building blocks - static Text2ImagePipeline latent_consistency_model( + // creates either SDXL pipeline from building blocks + static Text2ImagePipeline stable_diffusion_xl( const std::shared_ptr& scheduler_type, const CLIPTextModel& clip_text_model, + const CLIPTextModelWithProjection& clip_text_model_with_projection, const UNet2DConditionModel& unet, const AutoencoderKL& vae_decoder); @@ -148,6 +159,7 @@ class OPENVINO_GENAI_EXPORTS Text2ImagePipeline { explicit Text2ImagePipeline(const std::shared_ptr& impl); class StableDiffusionPipeline; + class StableDiffusionXLPipeline; }; // diff --git a/src/cpp/src/text2image/diffusion_pipeline.hpp b/src/cpp/src/text2image/diffusion_pipeline.hpp index 41dce0e030..1884df4ca6 100644 --- a/src/cpp/src/text2image/diffusion_pipeline.hpp +++ b/src/cpp/src/text2image/diffusion_pipeline.hpp @@ -1,6 +1,8 @@ // Copyright (C) 2023-2024 Intel Corporation // SPDX-License-Identifier: Apache-2.0 +#pragma once + #include #include "text2image/schedulers/ischeduler.hpp" diff --git a/src/cpp/src/text2image/models/clip_text_model.cpp b/src/cpp/src/text2image/models/clip_text_model.cpp index c1035709fd..5d75527705 100644 --- a/src/cpp/src/text2image/models/clip_text_model.cpp +++ b/src/cpp/src/text2image/models/clip_text_model.cpp @@ -111,5 +111,9 @@ ov::Tensor CLIPTextModel::infer(const std::string& pos_prompt, const std::string return m_request.get_output_tensor(0); } +ov::Tensor CLIPTextModel::get_output_tensor(const size_t idx) { + return m_request.get_output_tensor(idx); +} + } // namespace genai } // namespace ov diff --git a/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp b/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp new file mode 100644 index 0000000000..446a63fd56 --- /dev/null +++ b/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp @@ -0,0 +1,108 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "openvino/genai/text2image/clip_text_model_with_projection.hpp" + +#include + +#include "openvino/runtime/core.hpp" + +#include "utils.hpp" + +namespace ov { +namespace genai { + +CLIPTextModelWithProjection::Config::Config(const std::string& config_path) { + std::ifstream file(config_path); + OPENVINO_ASSERT(file.is_open(), "Failed to open ", config_path); + + nlohmann::json data = nlohmann::json::parse(file); + using utils::read_json_param; + + read_json_param(data, "max_position_embeddings", max_position_embeddings); + read_json_param(data, "hidden_size", hidden_size); +} + +CLIPTextModelWithProjection::CLIPTextModelWithProjection(const std::string root_dir) : + m_clip_tokenizer(root_dir + "/../tokenizer"), + m_config(root_dir + "/config.json") { + m_model = ov::Core().read_model(root_dir + "/openvino_model.xml"); +} + +CLIPTextModelWithProjection::CLIPTextModelWithProjection(const std::string& root_dir, + const std::string& device, + const ov::AnyMap& properties) : + CLIPTextModelWithProjection(root_dir) { + compile(device, properties); +} + +CLIPTextModelWithProjection::CLIPTextModelWithProjection(const CLIPTextModelWithProjection&) = default; + +const CLIPTextModelWithProjection::Config& CLIPTextModelWithProjection::get_config() const { + return m_config; +} + +CLIPTextModelWithProjection& CLIPTextModelWithProjection::reshape(int batch_size) { + OPENVINO_ASSERT(m_model, "Model has been already compiled. Cannot reshape already compiled model"); + + ov::PartialShape input_shape = m_model->input(0).get_partial_shape(); + input_shape[0] = batch_size; + input_shape[1] = m_config.max_position_embeddings; + std::map idx_to_shape{{0, input_shape}}; + m_model->reshape(idx_to_shape); + + return *this; +} + +CLIPTextModelWithProjection& CLIPTextModelWithProjection::compile(const std::string& device, const ov::AnyMap& properties) { + OPENVINO_ASSERT(m_model, "Model has been already compiled. Cannot re-compile already compiled model"); + ov::CompiledModel compiled_model = ov::Core().compile_model(m_model, device, properties); + m_request = compiled_model.create_infer_request(); + // release the original model + m_model.reset(); + + return *this; +} + +ov::Tensor CLIPTextModelWithProjection::infer(const std::string& pos_prompt, const std::string& neg_prompt, bool do_classifier_free_guidance) { + OPENVINO_ASSERT(m_request, "CLIP text encoder model must be compiled first. Cannot infer non-compiled model"); + + const int32_t pad_token_id = m_clip_tokenizer.get_pad_token_id(); + const size_t text_embedding_batch_size = do_classifier_free_guidance ? 2 : 1; + + auto perform_tokenization = [&](const std::string& prompt, ov::Tensor input_ids) { + std::fill_n(input_ids.data(), input_ids.get_size(), pad_token_id); + + ov::Tensor input_ids_token = m_clip_tokenizer.encode(prompt).input_ids; + std::copy_n(input_ids_token.data(), input_ids_token.get_size(), input_ids.data()); + }; + + ov::Tensor input_ids(ov::element::i64, {text_embedding_batch_size, m_config.max_position_embeddings}); + size_t current_batch_idx = 0; + + if (do_classifier_free_guidance) { + perform_tokenization(neg_prompt, + ov::Tensor(input_ids, {current_batch_idx , 0}, + {current_batch_idx + 1, m_config.max_position_embeddings})); + ++current_batch_idx; + } else { + // Negative prompt is ignored when --guidanceScale < 1.0 + } + + perform_tokenization(pos_prompt, + ov::Tensor(input_ids, {current_batch_idx , 0}, + {current_batch_idx + 1, m_config.max_position_embeddings})); + + // text embeddings + m_request.set_tensor("input_ids", input_ids); + m_request.infer(); + + return m_request.get_output_tensor(0); +} + +ov::Tensor CLIPTextModelWithProjection::get_output_tensor(const size_t idx) { + return m_request.get_output_tensor(idx); +} + +} // namespace genai +} // namespace ov diff --git a/src/cpp/src/text2image/numpy_utils.cpp b/src/cpp/src/text2image/numpy_utils.cpp new file mode 100644 index 0000000000..834d952092 --- /dev/null +++ b/src/cpp/src/text2image/numpy_utils.cpp @@ -0,0 +1,79 @@ +#include "text2image/numpy_utils.hpp" +#include "openvino/core/except.hpp" + +namespace ov { +namespace genai { +namespace numpy_utils { + +void rescale_zero_terminal_snr(std::vector& betas) { + // Convert betas to alphas_bar_sqrt + std::vector alphas, alphas_bar_sqrt; + for (float b : betas) { + alphas.push_back(1.0f - b); + } + + for (size_t i = 1; i <= alphas.size(); ++i) { + float alpha_cumprod = + std::accumulate(std::begin(alphas), std::begin(alphas) + i, 1.0, std::multiplies{}); + alphas_bar_sqrt.push_back(std::sqrt(alpha_cumprod)); + } + + float alphas_bar_sqrt_0 = alphas_bar_sqrt[0]; + float alphas_bar_sqrt_T = alphas_bar_sqrt[alphas_bar_sqrt.size() - 1]; + + for (float& x : alphas_bar_sqrt) { + // Shift so the last timestep is zero. + x = x - alphas_bar_sqrt_T; + // Scale so the first timestep is back to the old value. + x *= alphas_bar_sqrt_0 / (alphas_bar_sqrt_0 - alphas_bar_sqrt_T); + // Revert sqrt + x = std::pow(x, 2); + } + + // Revert cumprod + std::vector end = alphas_bar_sqrt, begin = alphas_bar_sqrt; + end.erase(end.begin()); + begin.pop_back(); + + alphas[0] = alphas_bar_sqrt[0]; + for (size_t i = 1; i < alphas.size(); ++i) { + alphas[i] = end[i - 1] / begin[i - 1]; + } + + std::transform(alphas.begin(), alphas.end(), betas.begin(), [](float x) { + return (1 - x); + }); +} + +std::vector interp(const std::vector& x, const std::vector& xp, const std::vector& fp) { + OPENVINO_ASSERT(xp.size() == fp.size(), "`xp` and `fp`vectors must have the same sizes"); + + std::vector interp_res; + + for (const auto& i : x) { + if (i <= xp[0]) { + interp_res.push_back(fp[0]); + } else if (i >= xp[xp.size() - 1]) { + interp_res.push_back(fp[fp.size() - 1]); + } else { + // Find the first xp element that is not less than x[i] + auto it = std::lower_bound(xp.begin(), xp.end(), i); + + // idx of the left boundary + size_t idx = std::distance(xp.begin(), it) - 1; + + float x0 = xp[idx], x1 = xp[idx + 1]; + float y0 = fp[idx], y1 = fp[idx + 1]; + + float interp_val = (y1 - y0) / (x1 - x0) * (i - x0) + y0; + + interp_res.push_back(interp_val); + } + } + + return interp_res; +} + +}// namespace ov +}// namespace genai +}// namespace txt2img_utils diff --git a/src/cpp/src/text2image/numpy_utils.hpp b/src/cpp/src/text2image/numpy_utils.hpp index 4520d35ae8..99f26b77ab 100644 --- a/src/cpp/src/text2image/numpy_utils.hpp +++ b/src/cpp/src/text2image/numpy_utils.hpp @@ -4,6 +4,12 @@ #pragma once #include +#include +#include +#include +#include +#include + namespace ov { namespace genai { @@ -31,6 +37,12 @@ std::vector linspace(U start, U end, size_t num, bool endpoint = false) { return indices; } +// Rescales betas to have zero terminal SNR Based on https://arxiv.org/pdf/2305.08891.pdf (Algorithm 1) +void rescale_zero_terminal_snr(std::vector& betas); + +// np.interp(...) implementation +std::vector interp(const std::vector& x, const std::vector& xp, const std::vector& fp); + }// namespace ov }// namespace genai }// namespace txt2img_utils diff --git a/src/cpp/src/text2image/schedulers/ddim.cpp b/src/cpp/src/text2image/schedulers/ddim.cpp index 470a8c8ec0..a25cf7227e 100644 --- a/src/cpp/src/text2image/schedulers/ddim.cpp +++ b/src/cpp/src/text2image/schedulers/ddim.cpp @@ -62,6 +62,7 @@ DDIMScheduler::DDIMScheduler(const Config& scheduler_config) } if (m_config.rescale_betas_zero_snr) { + using numpy_utils::rescale_zero_terminal_snr; rescale_zero_terminal_snr(betas); } @@ -157,7 +158,7 @@ std::map DDIMScheduler::step(ov::Tensor noise_pred, ov: break; default: OPENVINO_THROW("Unsupported value for 'PredictionType'"); - } + } } // TODO: support m_config.thresholding @@ -197,45 +198,5 @@ void DDIMScheduler::scale_model_input(ov::Tensor sample, size_t inference_step) return; } -void DDIMScheduler::rescale_zero_terminal_snr(std::vector& betas) { - // Convert betas to alphas_bar_sqrt - std::vector alphas, alphas_bar_sqrt; - for (float b : betas) { - alphas.push_back(1.0f - b); - } - - for (size_t i = 1; i <= alphas.size(); ++i) { - float alpha_cumprod = - std::accumulate(std::begin(alphas), std::begin(alphas) + i, 1.0, std::multiplies{}); - alphas_bar_sqrt.push_back(std::sqrt(alpha_cumprod)); - } - - float alphas_bar_sqrt_0 = alphas_bar_sqrt[0]; - float alphas_bar_sqrt_T = alphas_bar_sqrt[alphas_bar_sqrt.size() - 1]; - - for (float& x : alphas_bar_sqrt) { - // Shift so the last timestep is zero. - x = x - alphas_bar_sqrt_T; - // Scale so the first timestep is back to the old value. - x *= alphas_bar_sqrt_0 / (alphas_bar_sqrt_0 - alphas_bar_sqrt_T); - // Revert sqrt - x = std::pow(x, 2); - } - - // Revert cumprod - std::vector end = alphas_bar_sqrt, begin = alphas_bar_sqrt; - end.erase(end.begin()); - begin.pop_back(); - - alphas[0] = alphas_bar_sqrt[0]; - for (size_t i = 1; i < alphas.size(); ++i) { - alphas[i] = end[i - 1] / begin[i - 1]; - } - - std::transform(alphas.begin(), alphas.end(), betas.begin(), [](float x) { - return (1 - x); - }); -} - } // namespace genai } // namespace ov diff --git a/src/cpp/src/text2image/schedulers/ddim.hpp b/src/cpp/src/text2image/schedulers/ddim.hpp index 062fc14ce5..936f4991ea 100644 --- a/src/cpp/src/text2image/schedulers/ddim.hpp +++ b/src/cpp/src/text2image/schedulers/ddim.hpp @@ -52,8 +52,6 @@ class DDIMScheduler : public IScheduler { size_t m_num_inference_steps; std::vector m_timesteps; - - void rescale_zero_terminal_snr(std::vector& betas); }; } // namespace genai diff --git a/src/cpp/src/text2image/schedulers/euler_discrete.cpp b/src/cpp/src/text2image/schedulers/euler_discrete.cpp new file mode 100644 index 0000000000..9873a3998f --- /dev/null +++ b/src/cpp/src/text2image/schedulers/euler_discrete.cpp @@ -0,0 +1,281 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "text2image/schedulers/euler_discrete.hpp" + +#include +#include +#include +#include + +#include "text2image/numpy_utils.hpp" +#include "utils.hpp" + +namespace ov { +namespace genai { + +EulerDiscreteScheduler::Config::Config(const std::string& scheduler_config_path) { + std::ifstream file(scheduler_config_path); + OPENVINO_ASSERT(file.is_open(), "Failed to open ", scheduler_config_path); + + nlohmann::json data = nlohmann::json::parse(file); + using utils::read_json_param; + + read_json_param(data, "num_train_timesteps", num_train_timesteps); + read_json_param(data, "beta_start", beta_start); + read_json_param(data, "beta_end", beta_end); + read_json_param(data, "beta_schedule", beta_schedule); + read_json_param(data, "trained_betas", trained_betas); + read_json_param(data, "final_sigmas_type", final_sigmas_type); + read_json_param(data, "interpolation_type", interpolation_type); + read_json_param(data, "sigma_max", sigma_max); + read_json_param(data, "sigma_min", sigma_min); + read_json_param(data, "steps_offset", steps_offset); + read_json_param(data, "prediction_type", prediction_type); + read_json_param(data, "timestep_spacing", timestep_spacing); + read_json_param(data, "timestep_type", timestep_type); + read_json_param(data, "rescale_betas_zero_snr", rescale_betas_zero_snr); + read_json_param(data, "use_karras_sigmas", use_karras_sigmas); + read_json_param(data, "use_exponential_sigmas", use_exponential_sigmas); + read_json_param(data, "use_beta_sigmas", use_beta_sigmas); +} + +EulerDiscreteScheduler::EulerDiscreteScheduler(const std::string scheduler_config_path) + : EulerDiscreteScheduler(Config(scheduler_config_path)) {} + +EulerDiscreteScheduler::EulerDiscreteScheduler(const Config& scheduler_config) : m_config(scheduler_config) { + std::vector alphas, betas; + + using numpy_utils::linspace; + + if (!m_config.trained_betas.empty()) { + betas = m_config.trained_betas; + } else if (m_config.beta_schedule == BetaSchedule::LINEAR) { + betas = linspace(m_config.beta_start, m_config.beta_end, m_config.num_train_timesteps); + } else if (m_config.beta_schedule == BetaSchedule::SCALED_LINEAR) { + float start = std::sqrt(m_config.beta_start); + float end = std::sqrt(m_config.beta_end); + betas = linspace(start, end, m_config.num_train_timesteps); + std::for_each(betas.begin(), betas.end(), [](float& x) { + x *= x; + }); + } else { + OPENVINO_THROW( + "'beta_schedule' must be one of 'LINEAR' or 'SCALED_LINEAR'. Please, add support of other types"); + } + + if (m_config.rescale_betas_zero_snr) { + using numpy_utils::rescale_zero_terminal_snr; + rescale_zero_terminal_snr(betas); + } + + std::transform(betas.begin(), betas.end(), std::back_inserter(alphas), [](float b) { + return 1.0f - b; + }); + + for (size_t i = 1; i <= alphas.size(); ++i) { + float alpha_cumprod = + std::accumulate(std::begin(alphas), std::begin(alphas) + i, 1.0, std::multiplies{}); + m_alphas_cumprod.push_back(alpha_cumprod); + } + + if (m_config.rescale_betas_zero_snr) { + m_alphas_cumprod.back() = std::pow(2, -24); + } + + for (auto it = m_alphas_cumprod.rbegin(); it != m_alphas_cumprod.rend(); ++it) { + float sigma = std::pow(((1 - (*it)) / (*it)), 0.5); + m_sigmas.push_back(sigma); + } + + auto linspaced = + linspace(0.0f, static_cast(m_config.num_train_timesteps - 1), m_config.num_train_timesteps, true); + for (auto it = linspaced.rbegin(); it != linspaced.rend(); ++it) { + m_timesteps.push_back(static_cast(std::round(*it))); + } + + OPENVINO_ASSERT( + m_config.timestep_type != TimestepType::CONTINUOUS || m_config.prediction_type != PredictionType::V_PREDICTION, + "This case isn't supported: `timestep_type=continuous` and `prediction_type=v_prediction`. Please, add " + "support."); + + m_sigmas.push_back(0); +} + +void EulerDiscreteScheduler::set_timesteps(size_t num_inference_steps) { + // TODO: support `timesteps` and `sigmas` inputs + m_timesteps.clear(); + m_sigmas.clear(); + + m_num_inference_steps = num_inference_steps; + std::vector sigmas; + + OPENVINO_ASSERT( + m_config.timestep_type != TimestepType::CONTINUOUS || m_config.prediction_type != PredictionType::V_PREDICTION, + "This case isn't supported: `timestep_type=continuous` and `prediction_type=v_prediction`. Please, add " + "support."); + + switch (m_config.timestep_spacing) { + case TimestepSpacing::LINSPACE: { + using numpy_utils::linspace; + float end = static_cast(m_config.num_train_timesteps - 1); + auto linspaced = linspace(0.0f, end, num_inference_steps, true); + for (auto it = linspaced.rbegin(); it != linspaced.rend(); ++it) { + m_timesteps.push_back(static_cast(std::round(*it))); + } + break; + } + case TimestepSpacing::LEADING: { + size_t step_ratio = m_config.num_train_timesteps / m_num_inference_steps; + for (size_t i = num_inference_steps - 1; i != -1; --i) { + m_timesteps.push_back(i * step_ratio + m_config.steps_offset); + } + break; + } + case TimestepSpacing::TRAILING: { + float step_ratio = static_cast(m_config.num_train_timesteps) / static_cast(m_num_inference_steps); + for (float i = m_config.num_train_timesteps; i > 0; i -= step_ratio) { + m_timesteps.push_back(static_cast(std::round(i)) - 1); + } + break; + } + default: + OPENVINO_THROW("Unsupported value for 'timestep_spacing'"); + } + + for (const float& i : m_alphas_cumprod) { + float sigma = std::pow(((1 - i) / i), 0.5); + sigmas.push_back(sigma); + } + + switch (m_config.interpolation_type) { + case InterpolationType::LINEAR: { + using numpy_utils::interp; + + std::vector x_data_points(sigmas.size()); + std::iota(x_data_points.begin(), x_data_points.end(), 0); + m_sigmas = interp(m_timesteps, x_data_points, sigmas); + break; + } + case InterpolationType::LOG_LINEAR: { + using numpy_utils::linspace; + + m_sigmas = linspace(std::log(sigmas.back()), std::log(sigmas[0]), num_inference_steps + 1, true); + std::transform(m_sigmas.begin(), m_sigmas.end(), m_sigmas.begin(), [](float x) { + return std::exp(x); + }); + break; + } + default: + OPENVINO_THROW("Unsupported value for 'interpolation_type'"); + } + + OPENVINO_ASSERT(!m_config.use_karras_sigmas, + "Parameter 'use_karras_sigmas' is not supported. Please, add support."); + + OPENVINO_ASSERT(!m_config.use_exponential_sigmas, + "Parameter 'use_exponential_sigmas' is not supported. Please, add support."); + + OPENVINO_ASSERT(!m_config.use_beta_sigmas, "Parameter 'use_beta_sigmas' is not supported. Please, add support."); + + float sigma_last = 0; + switch (m_config.final_sigmas_type) { + case FinalSigmaType::SIGMA_MIN: + sigma_last = std::pow(((1 - m_alphas_cumprod[0]) / m_alphas_cumprod[0]), 0.5); + break; + case FinalSigmaType::ZERO: + break; + default: + OPENVINO_THROW("Unsupported value for 'final_sigmas_type'"); + } + m_sigmas.push_back(sigma_last); +} + +std::map EulerDiscreteScheduler::step(ov::Tensor noise_pred, + ov::Tensor latents, + size_t inference_step) { + // noise_pred - model_output + // latents - sample + // inference_step + + size_t timestep = get_timesteps()[inference_step]; + + if (m_step_index == -1) + m_step_index = 0; + + float sigma = m_sigmas[m_step_index]; + // TODO: hardcoded gamma + float gamma = 0.0f; + float sigma_hat = sigma * (gamma + 1); + + float* model_output_data = noise_pred.data(); + float* sample_data = latents.data(); + + ov::Tensor pred_original_sample(noise_pred.get_element_type(), noise_pred.get_shape()); + float* pred_original_sample_data = pred_original_sample.data(); + + ov::Tensor prev_sample(noise_pred.get_element_type(), noise_pred.get_shape()); + float* prev_sample_data = prev_sample.data(); + + // 1. compute predicted original sample (x_0) from sigma-scaled predicted noise + switch (m_config.prediction_type) { + case PredictionType::EPSILON: + for (size_t i = 0; i < noise_pred.get_size(); ++i) { + pred_original_sample_data[i] = sample_data[i] - model_output_data[i] * sigma_hat; + } + break; + case PredictionType::SAMPLE: + for (size_t i = 0; i < noise_pred.get_size(); ++i) { + pred_original_sample_data[i] = model_output_data[i]; + } + break; + case PredictionType::V_PREDICTION: + for (size_t i = 0; i < noise_pred.get_size(); ++i) { + pred_original_sample_data[i] = model_output_data[i] * (-sigma / std::pow((std::pow(sigma, 2) + 1), 0.5)) + + (sample_data[i] / (std::pow(sigma, 2) + 1)); + } + break; + default: + OPENVINO_THROW("Unsupported value for 'PredictionType'"); + } + + float dt = m_sigmas[m_step_index + 1] - sigma_hat; + + // 2. Convert to an ODE derivative + for (size_t i = 0; i < prev_sample.get_size(); ++i) { + prev_sample_data[i] = ((sample_data[i] - pred_original_sample_data[i]) / sigma_hat) * dt + sample_data[i]; + } + + m_step_index += 1; + + return {{"latent", prev_sample}, {"denoised", pred_original_sample}}; +} + +std::vector EulerDiscreteScheduler::get_timesteps() const { + return m_timesteps; +} + +float EulerDiscreteScheduler::get_init_noise_sigma() const { + float max_sigma = *std::max_element(m_sigmas.begin(), m_sigmas.end()); + + if (m_config.timestep_spacing == TimestepSpacing::LINSPACE || + m_config.timestep_spacing == TimestepSpacing::TRAILING) { + return max_sigma; + } + + return std::sqrt(max_sigma * max_sigma + 1); +} + +void EulerDiscreteScheduler::scale_model_input(ov::Tensor sample, size_t inference_step) { + if (m_step_index == -1) + m_step_index = 0; + + float sigma = m_sigmas[m_step_index]; + float* sample_data = sample.data(); + for (size_t i = 0; i < sample.get_size(); i++) { + sample_data[i] /= std::pow((std::pow(sigma, 2) + 1), 0.5); + } +} + +} // namespace genai +} // namespace ov diff --git a/src/cpp/src/text2image/schedulers/euler_discrete.hpp b/src/cpp/src/text2image/schedulers/euler_discrete.hpp new file mode 100644 index 0000000000..1dc60f118f --- /dev/null +++ b/src/cpp/src/text2image/schedulers/euler_discrete.hpp @@ -0,0 +1,60 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include + +#include "text2image/schedulers/types.hpp" +#include "text2image/schedulers/ischeduler.hpp" + +namespace ov { +namespace genai { + +class EulerDiscreteScheduler : public IScheduler { +public: + struct Config { + int32_t num_train_timesteps = 1000; + float beta_start = 0.0001f, beta_end = 0.02f; + BetaSchedule beta_schedule = BetaSchedule::SCALED_LINEAR; + std::vector trained_betas = {}; + FinalSigmaType final_sigmas_type = FinalSigmaType::ZERO; + InterpolationType interpolation_type = InterpolationType::LINEAR; + float sigma_max = 0.0f, sigma_min = 0.0f; + size_t steps_offset = 0; + PredictionType prediction_type = PredictionType::EPSILON; + TimestepSpacing timestep_spacing = TimestepSpacing::LEADING; + TimestepType timestep_type = TimestepType::DISCRETE; + bool rescale_betas_zero_snr = false; + bool use_karras_sigmas = false, use_exponential_sigmas = false, use_beta_sigmas = false; + + Config() = default; + explicit Config(const std::string& scheduler_config_path); + }; + + explicit EulerDiscreteScheduler(const std::string scheduler_config_path); + explicit EulerDiscreteScheduler(const Config& scheduler_config); + + void set_timesteps(size_t num_inference_steps) override; + + std::vector get_timesteps() const override; + + float get_init_noise_sigma() const override; + + void scale_model_input(ov::Tensor sample, size_t inference_step) override; + + std::map step(ov::Tensor noise_pred, ov::Tensor latents, size_t inference_step) override; + +private: + Config m_config; + + std::vector m_alphas_cumprod, m_sigmas; + std::vector m_timesteps; + size_t m_num_inference_steps; + + size_t m_step_index = -1; +}; + +} // namespace genai +} // namespace ov diff --git a/src/cpp/src/text2image/schedulers/scheduler.cpp b/src/cpp/src/text2image/schedulers/scheduler.cpp index cf14640b7c..44b08d67fc 100644 --- a/src/cpp/src/text2image/schedulers/scheduler.cpp +++ b/src/cpp/src/text2image/schedulers/scheduler.cpp @@ -10,6 +10,7 @@ #include "text2image/schedulers/lcm.hpp" #include "text2image/schedulers/lms_discrete.hpp" #include "text2image/schedulers/ddim.hpp" +#include "text2image/schedulers/euler_discrete.hpp" namespace ov { namespace genai { @@ -35,6 +36,8 @@ std::shared_ptr Text2ImagePipeline::Scheduler::fr scheduler = std::make_shared(scheduler_config_path); } else if (scheduler_type == Scheduler::Type::DDIM) { scheduler = std::make_shared(scheduler_config_path); + } else if (scheduler_type == Scheduler::Type::EULER_DISCRETE) { + scheduler = std::make_shared(scheduler_config_path); } else { OPENVINO_THROW("Unsupported scheduler type '", scheduler_type, ". Please, manually create scheduler via supported one"); } diff --git a/src/cpp/src/text2image/schedulers/types.cpp b/src/cpp/src/text2image/schedulers/types.cpp index 4ecdcea811..0ca970f359 100644 --- a/src/cpp/src/text2image/schedulers/types.cpp +++ b/src/cpp/src/text2image/schedulers/types.cpp @@ -49,6 +49,8 @@ void read_json_param(const nlohmann::json& data, const std::string& name, Text2I param = Text2ImagePipeline::Scheduler::DDIM; else if (scheduler_type_str == "LMSDiscreteScheduler") param = Text2ImagePipeline::Scheduler::LMS_DISCRETE; + else if (scheduler_type_str == "EulerDiscreteScheduler") + param = Text2ImagePipeline::Scheduler::EULER_DISCRETE; else if (!scheduler_type_str.empty()) { OPENVINO_THROW("Unsupported value for 'prediction_type' ", scheduler_type_str); } @@ -71,6 +73,48 @@ void read_json_param(const nlohmann::json& data, const std::string& name, Timest } } +template <> +void read_json_param(const nlohmann::json& data, const std::string& name, InterpolationType& param) { + if (data.contains(name) && data[name].is_string()) { + std::string interpolation_type = data[name].get(); + if (interpolation_type == "linear") + param = InterpolationType::LINEAR; + else if (interpolation_type == "log_linear") + param = InterpolationType::LOG_LINEAR; + else if (!interpolation_type.empty()) { + OPENVINO_THROW("Unsupported value for 'interpolation_type' ", interpolation_type); + } + } +} + +template <> +void read_json_param(const nlohmann::json& data, const std::string& name, FinalSigmaType& param) { + if (data.contains(name) && data[name].is_string()) { + std::string final_sigma_type = data[name].get(); + if (final_sigma_type == "zero") + param = FinalSigmaType::ZERO; + else if (final_sigma_type == "sigma_min") + param = FinalSigmaType::SIGMA_MIN; + else if (!final_sigma_type.empty()) { + OPENVINO_THROW("Unsupported value for 'final_sigma_type' ", final_sigma_type); + } + } +} + +template <> +void read_json_param(const nlohmann::json& data, const std::string& name, TimestepType& param) { + if (data.contains(name) && data[name].is_string()) { + std::string timestep_type = data[name].get(); + if (timestep_type == "discrete") + param = TimestepType::DISCRETE; + else if (timestep_type == "continuous") + param = TimestepType::CONTINUOUS; + else if (!timestep_type.empty()) { + OPENVINO_THROW("Unsupported value for 'timestep_type' ", timestep_type); + } + } +} + } // namespace utils } // namespace genai } // namespace ov @@ -83,6 +127,8 @@ std::ostream& operator<<(std::ostream& os, const ov::genai::Text2ImagePipeline:: return os << "LMSDiscreteScheduler"; case ov::genai::Text2ImagePipeline::Scheduler::Type::DDIM: return os << "DDIMScheduler"; + case ov::genai::Text2ImagePipeline::Scheduler::Type::EULER_DISCRETE: + return os << "EulerDiscreteScheduler"; case ov::genai::Text2ImagePipeline::Scheduler::Type::AUTO: return os << "AutoScheduler"; default: diff --git a/src/cpp/src/text2image/schedulers/types.hpp b/src/cpp/src/text2image/schedulers/types.hpp index 3029998f95..74fde4f993 100644 --- a/src/cpp/src/text2image/schedulers/types.hpp +++ b/src/cpp/src/text2image/schedulers/types.hpp @@ -30,6 +30,21 @@ enum class TimestepSpacing { LEADING }; +enum class InterpolationType { + LINEAR, + LOG_LINEAR +}; + +enum class FinalSigmaType { + ZERO, + SIGMA_MIN +}; + +enum class TimestepType { + DISCRETE, + CONTINUOUS +}; + namespace utils { template <> @@ -44,6 +59,15 @@ void read_json_param(const nlohmann::json& data, const std::string& name, Text2I template <> void read_json_param(const nlohmann::json& data, const std::string& name, TimestepSpacing& param); +template <> +void read_json_param(const nlohmann::json& data, const std::string& name, InterpolationType& param); + +template <> +void read_json_param(const nlohmann::json& data, const std::string& name, FinalSigmaType& param); + +template <> +void read_json_param(const nlohmann::json& data, const std::string& name, TimestepType& param); + } // namespace utils } // namespace genai } // namespace ov diff --git a/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp b/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp new file mode 100644 index 0000000000..5d80d59aea --- /dev/null +++ b/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp @@ -0,0 +1,345 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "text2image/diffusion_pipeline.hpp" + +#include +#include + +#include "utils.hpp" + + +namespace ov { +namespace genai { + +class Text2ImagePipeline::StableDiffusionXLPipeline : public Text2ImagePipeline::DiffusionPipeline { +public: + explicit StableDiffusionXLPipeline(const std::string& root_dir) { + const std::string model_index_path = root_dir + "/model_index.json"; + std::ifstream file(model_index_path); + OPENVINO_ASSERT(file.is_open(), "Failed to open ", model_index_path); + + nlohmann::json data = nlohmann::json::parse(file); + using utils::read_json_param; + + set_scheduler(Scheduler::from_config(root_dir + "/scheduler/scheduler_config.json")); + + const std::string text_encoder = data["text_encoder"][1].get(); + if (text_encoder == "CLIPTextModel") { + m_clip_text_encoder = std::make_shared(root_dir + "/text_encoder"); + } else { + OPENVINO_THROW("Unsupported '", text_encoder, "' text encoder type"); + } + + const std::string text_encoder_2 = data["text_encoder_2"][1].get(); + if (text_encoder_2 == "CLIPTextModelWithProjection") { + m_clip_text_encoder_with_projection = std::make_shared(root_dir + "/text_encoder_2"); + } else { + OPENVINO_THROW("Unsupported '", text_encoder, "' text encoder type"); + } + + const std::string unet = data["unet"][1].get(); + if (unet == "UNet2DConditionModel") { + m_unet = std::make_shared(root_dir + "/unet"); + } else { + OPENVINO_THROW("Unsupported '", unet, "' UNet type"); + } + + const std::string vae = data["vae"][1].get(); + if (vae == "AutoencoderKL") { + m_vae_decoder = std::make_shared(root_dir + "/vae_decoder"); + } else { + OPENVINO_THROW("Unsupported '", vae, "' VAE decoder type"); + } + + // initialize generation config + initialize_generation_config(data["_class_name"].get()); + } + + StableDiffusionXLPipeline(const std::string& root_dir, const std::string& device, const ov::AnyMap& properties) { + const std::string model_index_path = root_dir + "/model_index.json"; + std::ifstream file(model_index_path); + OPENVINO_ASSERT(file.is_open(), "Failed to open ", model_index_path); + + nlohmann::json data = nlohmann::json::parse(file); + using utils::read_json_param; + + set_scheduler(Scheduler::from_config(root_dir + "/scheduler/scheduler_config.json")); + + const std::string text_encoder = data["text_encoder"][1].get(); + if (text_encoder == "CLIPTextModel") { + m_clip_text_encoder = std::make_shared(root_dir + "/text_encoder", device, properties); + } else { + OPENVINO_THROW("Unsupported '", text_encoder, "' text encoder type"); + } + + const std::string text_encoder_2 = data["text_encoder_2"][1].get(); + if (text_encoder_2 == "CLIPTextModelWithProjection") { + m_clip_text_encoder_with_projection = std::make_shared(root_dir + "/text_encoder_2", device, properties); + } else { + OPENVINO_THROW("Unsupported '", text_encoder, "' text encoder type"); + } + + const std::string unet = data["unet"][1].get(); + if (unet == "UNet2DConditionModel") { + m_unet = std::make_shared(root_dir + "/unet", device, properties); + } else { + OPENVINO_THROW("Unsupported '", unet, "' UNet type"); + } + + const std::string vae = data["vae"][1].get(); + if (vae == "AutoencoderKL") { + m_vae_decoder = std::make_shared(root_dir + "/vae_decoder", device, properties); + } else { + OPENVINO_THROW("Unsupported '", vae, "' VAE decoder type"); + } + + // initialize generation config + initialize_generation_config(data["_class_name"].get()); + } + + StableDiffusionXLPipeline( + const CLIPTextModel& clip_text_model, + const CLIPTextModelWithProjection& clip_text_model_with_projection, + const UNet2DConditionModel& unet, + const AutoencoderKL& vae_decoder) + : m_clip_text_encoder(std::make_shared(clip_text_model)), + m_clip_text_encoder_with_projection(std::make_shared(clip_text_model_with_projection)), + m_unet(std::make_shared(unet)), + m_vae_decoder(std::make_shared(vae_decoder)) { } + + void reshape(const int num_images_per_prompt, const int height, const int width, const float guidance_scale) override { + check_inputs(height, width); + + const size_t batch_size_multiplier = do_classifier_free_guidance(guidance_scale) ? 2 : 1; // Unet accepts 2x batch in case of CFG + m_clip_text_encoder->reshape(batch_size_multiplier); + // TODO: m_unet reshape + m_unet->reshape(num_images_per_prompt * batch_size_multiplier, height, width, m_clip_text_encoder->get_config().max_position_embeddings); + m_vae_decoder->reshape(num_images_per_prompt, height, width); + } + + void compile(const std::string& device, const ov::AnyMap& properties) override { + m_clip_text_encoder->compile(device, properties); + m_clip_text_encoder_with_projection->compile(device, properties); + m_unet->compile(device, properties); + m_vae_decoder->compile(device, properties); + } + + ov::Tensor generate(const std::string& positive_prompt, + const ov::AnyMap& properties) override { + GenerationConfig generation_config = m_generation_config; + generation_config.update_generation_config(properties); + + // Stable Diffusion pipeline + // see https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline#deconstruct-the-stable-diffusion-pipeline + + const auto& unet_config = m_unet->get_config(); + const size_t batch_size_multiplier = do_classifier_free_guidance(generation_config.guidance_scale) ? 2 : 1; // Unet accepts 2x batch in case of CFG + const size_t vae_scale_factor = m_unet->get_vae_scale_factor(); + + if (generation_config.height < 0) + generation_config.height = unet_config.sample_size * vae_scale_factor; + if (generation_config.width < 0) + generation_config.width = unet_config.sample_size * vae_scale_factor; + check_inputs(generation_config.height, generation_config.width); + + if (generation_config.random_generator == nullptr) { + uint32_t seed = time(NULL); + generation_config.random_generator = std::make_shared(seed); + } + + std::vector time_ids = {static_cast(generation_config.width), + static_cast(generation_config.height), + 0, + 0, + static_cast(generation_config.width), + static_cast(generation_config.height), + }; + ov::Tensor add_time_ids(ov::element::f32, {batch_size_multiplier, time_ids.size()}); + float* add_time_ids_data = add_time_ids.data(); + std::copy(time_ids.begin(), time_ids.end(), add_time_ids_data); + + if (batch_size_multiplier > 1) { + std::copy(time_ids.begin(), time_ids.end(), add_time_ids_data + time_ids.size()); + } + + ov::Tensor add_text_embeds = m_clip_text_encoder_with_projection->infer(positive_prompt, generation_config.negative_prompt, batch_size_multiplier > 1); + + m_clip_text_encoder->infer(positive_prompt, generation_config.negative_prompt, batch_size_multiplier > 1); + // ov::Tensor encoder_hidden_states_1 = m_clip_text_encoder->get_tensor("hidden_states.11"); + ov::Tensor encoder_hidden_states_1 = m_clip_text_encoder->get_output_tensor(13); + // ov::Tensor encoder_hidden_states_2 = m_clip_text_encoder_with_projection->get_tensor("hidden_states.31"); + ov::Tensor encoder_hidden_states_2 = m_clip_text_encoder_with_projection->get_output_tensor(33); + + + ov::Shape ehs_1_shape = encoder_hidden_states_1.get_shape(); + ov::Shape ehs_2_shape = encoder_hidden_states_2.get_shape(); + + OPENVINO_ASSERT(ehs_1_shape[0] == ehs_2_shape[0] && ehs_1_shape[1] == ehs_2_shape[1], + "Tensors for concatenation must have the same dimensions"); + + ov::Shape encoder_hidden_states_shape = {ehs_1_shape[0], ehs_1_shape[1], ehs_1_shape[2] + ehs_2_shape[2]}; + ov::Tensor encoder_hidden_states(encoder_hidden_states_1.get_element_type(), encoder_hidden_states_shape); + + const float* ehs_1_data = encoder_hidden_states_1.data(); + const float* ehs_2_data = encoder_hidden_states_2.data(); + float* encoder_hidden_states_data = encoder_hidden_states.data(); + + for (size_t i = 0; i < ehs_1_shape[0]; ++i) { + for (size_t j = 0; j < ehs_1_shape[1]; ++j) { + size_t offset_1 = (i * ehs_1_shape[1] + j) * ehs_1_shape[2]; + size_t offset_2 = (i * ehs_2_shape[1] + j) * ehs_2_shape[2]; + + size_t step = (i * ehs_1_shape[1] + j) * (ehs_1_shape[2] + ehs_2_shape[2]); + + std::memcpy(encoder_hidden_states_data + step, ehs_1_data + offset_1, ehs_1_shape[2] * sizeof(float)); + std::memcpy(encoder_hidden_states_data + step + ehs_1_shape[2], ehs_2_data + offset_2, ehs_2_shape[2] * sizeof(float)); + } + } + + // replicate encoder hidden state to UNet model + if (generation_config.num_images_per_prompt == 1) { + // reuse output of text encoder directly w/o extra memory copy + m_unet->set_hidden_states("encoder_hidden_states", encoder_hidden_states); + m_unet->set_hidden_states("text_embeds", add_text_embeds); + m_unet->set_hidden_states("time_ids", add_time_ids); + + } else { + ov::Shape enc_shape = encoder_hidden_states.get_shape(); + enc_shape[0] *= generation_config.num_images_per_prompt; + + ov::Tensor encoder_hidden_states_repeated(encoder_hidden_states.get_element_type(), enc_shape); + for (size_t n = 0; n < generation_config.num_images_per_prompt; ++n) { + batch_copy(encoder_hidden_states, encoder_hidden_states_repeated, 0, n); + if (batch_size_multiplier > 1) { + batch_copy(encoder_hidden_states, encoder_hidden_states_repeated, + 1, generation_config.num_images_per_prompt + n); + } + } + + m_unet->set_hidden_states("encoder_hidden_states", encoder_hidden_states_repeated); + + ov::Shape t_emb_shape = add_text_embeds.get_shape(); + t_emb_shape[0] *= generation_config.num_images_per_prompt; + + ov::Tensor add_text_embeds_repeated(add_text_embeds.get_element_type(), t_emb_shape); + for (size_t n = 0; n < generation_config.num_images_per_prompt; ++n) { + batch_copy(add_text_embeds, add_text_embeds_repeated, 0, n); + if (batch_size_multiplier > 1) { + batch_copy(add_text_embeds, add_text_embeds_repeated, + 1, generation_config.num_images_per_prompt + n); + } + } + + m_unet->set_hidden_states("text_embeds", add_text_embeds_repeated); + + ov::Shape t_ids_shape = add_time_ids.get_shape(); + t_ids_shape[0] *= generation_config.num_images_per_prompt; + ov::Tensor add_time_ids_repeated(add_time_ids.get_element_type(), t_ids_shape); + for (size_t n = 0; n < generation_config.num_images_per_prompt; ++n) { + batch_copy(add_time_ids, add_time_ids_repeated, 0, n); + if (batch_size_multiplier > 1) { + batch_copy(add_time_ids, add_time_ids_repeated, + 1, generation_config.num_images_per_prompt + n); + } + } + + m_unet->set_hidden_states("time_ids", add_time_ids_repeated); + } + + m_scheduler->set_timesteps(generation_config.num_inference_steps); + std::vector timesteps = m_scheduler->get_timesteps(); + + // latents are multiplied by 'init_noise_sigma' + ov::Shape latent_shape{generation_config.num_images_per_prompt, unet_config.in_channels, + generation_config.height / vae_scale_factor, generation_config.width / vae_scale_factor}; + ov::Shape latent_shape_cfg = latent_shape; + latent_shape_cfg[0] *= batch_size_multiplier; + + ov::Tensor latent(ov::element::f32, latent_shape), latent_cfg(ov::element::f32, latent_shape_cfg); + std::generate_n(latent.data(), latent.get_size(), [&]() -> float { + return generation_config.random_generator->next() * m_scheduler->get_init_noise_sigma(); + }); + + ov::Tensor denoised, noisy_residual_tensor(ov::element::f32, {}); + for (size_t inference_step = 0; inference_step < generation_config.num_inference_steps; inference_step++) { + // concat the same latent twice along a batch dimension in case of CFG + if (batch_size_multiplier > 1) { + batch_copy(latent, latent_cfg, 0, 0, generation_config.num_images_per_prompt); + batch_copy(latent, latent_cfg, 0, generation_config.num_images_per_prompt, generation_config.num_images_per_prompt); + } else { + // just assign to save memory copy + latent_cfg = latent; + } + + m_scheduler->scale_model_input(latent_cfg, inference_step); + + ov::Tensor timestep(ov::element::i64, {1}, ×teps[inference_step]); + ov::Tensor noise_pred_tensor = m_unet->infer(latent_cfg, timestep); + + ov::Shape noise_pred_shape = noise_pred_tensor.get_shape(); + noise_pred_shape[0] /= batch_size_multiplier; + noisy_residual_tensor.set_shape(noise_pred_shape); + + if (batch_size_multiplier > 1) { + // perform guidance + float* noisy_residual = noisy_residual_tensor.data(); + const float* noise_pred_uncond = noise_pred_tensor.data(); + const float* noise_pred_text = noise_pred_uncond + noisy_residual_tensor.get_size(); + + for (size_t i = 0; i < noisy_residual_tensor.get_size(); ++i) { + noisy_residual[i] = noise_pred_uncond[i] + + generation_config.guidance_scale * (noise_pred_text[i] - noise_pred_uncond[i]); + } + } else { + noisy_residual_tensor = noise_pred_tensor; + } + + auto scheduler_step_result = m_scheduler->step(noisy_residual_tensor, latent, inference_step); + latent = scheduler_step_result["latent"]; + + // check whether scheduler returns "denoised" image, which should be passed to VAE decoder + const auto it = scheduler_step_result.find("denoised"); + denoised = it != scheduler_step_result.end() ? it->second : latent; + } + + return m_vae_decoder->infer(denoised); + } + +private: + bool do_classifier_free_guidance(float guidance_scale) const { + return guidance_scale > 1.0 && m_unet->get_config().time_cond_proj_dim < 0; + } + + void initialize_generation_config(const std::string& class_name) override { + assert(m_unet != nullptr); + const auto& unet_config = m_unet->get_config(); + const size_t vae_scale_factor = m_unet->get_vae_scale_factor(); + + m_generation_config.height = unet_config.sample_size * vae_scale_factor; + m_generation_config.width = unet_config.sample_size * vae_scale_factor; + + if (class_name == "StableDiffusionXLPipeline") { + m_generation_config.guidance_scale = 7.5f; + m_generation_config.num_inference_steps = 50; + } else { + OPENVINO_THROW("Unsupported class_name '", class_name, "'. Please, contact OpenVINO GenAI developers"); + } + } + + void check_inputs(const int height, const int width) const override { + assert(m_unet != nullptr); + const size_t vae_scale_factor = m_unet->get_vae_scale_factor(); + OPENVINO_ASSERT((height % vae_scale_factor == 0 || height < 0) && + (width % vae_scale_factor == 0 || width < 0), "Both 'width' and 'height' must be divisible by", + vae_scale_factor); + } + + std::shared_ptr m_clip_text_encoder; + std::shared_ptr m_clip_text_encoder_with_projection; + std::shared_ptr m_unet; + std::shared_ptr m_vae_decoder; +}; + +} // namespace genai +} // namespace ov diff --git a/src/cpp/src/text2image/text2image_pipeline.cpp b/src/cpp/src/text2image/text2image_pipeline.cpp index e5acb1eacc..77d94ffc5c 100644 --- a/src/cpp/src/text2image/text2image_pipeline.cpp +++ b/src/cpp/src/text2image/text2image_pipeline.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 #include "text2image/stable_diffusion_pipeline.hpp" +#include "text2image/stable_diffusion_xl_pipeline.hpp" #include #include @@ -60,8 +61,9 @@ void Text2ImagePipeline::GenerationConfig::validate() const { Text2ImagePipeline::Text2ImagePipeline(const std::string& root_dir) { const std::string class_name = get_class_name(root_dir); - if (class_name == "StableDiffusionPipeline" || - class_name == "LatentConsistencyModelPipeline") { + if (class_name == "StableDiffusionPipeline" || + class_name == "LatentConsistencyModelPipeline"|| + class_name == "StableDiffusionXLPipeline") { m_impl = std::make_shared(root_dir); } else { OPENVINO_THROW("Unsupported text to image generation pipeline '", class_name, "'"); @@ -74,6 +76,8 @@ Text2ImagePipeline::Text2ImagePipeline(const std::string& root_dir, const std::s if (class_name == "StableDiffusionPipeline" || class_name == "LatentConsistencyModelPipeline") { m_impl = std::make_shared(root_dir, device, properties); + } else if (class_name == "StableDiffusionXLPipeline") { + m_impl = std::make_shared(root_dir, device, properties); } else { OPENVINO_THROW("Unsupported text to image generation pipeline '", class_name, "'"); } @@ -105,6 +109,20 @@ Text2ImagePipeline Text2ImagePipeline::latent_consistency_model( return stable_diffusion(scheduler, clip_text_model, unet, vae_decoder); } +Text2ImagePipeline Text2ImagePipeline::stable_diffusion_xl( + const std::shared_ptr& scheduler, + const CLIPTextModel& clip_text_model, + const CLIPTextModelWithProjection& clip_text_model_with_projection, + const UNet2DConditionModel& unet, + const AutoencoderKL& vae_decoder) { + auto impl = std::make_shared(clip_text_model, clip_text_model_with_projection, unet, vae_decoder); + + assert(scheduler != nullptr); + impl->set_scheduler(scheduler); + + return Text2ImagePipeline(impl); +} + Text2ImagePipeline::GenerationConfig Text2ImagePipeline::get_generation_config() const { return m_impl->get_generation_config(); } From 0663533880e2a10c57bb331b020459304b9c40a8 Mon Sep 17 00:00:00 2001 From: likholat Date: Mon, 7 Oct 2024 19:07:11 +0200 Subject: [PATCH 34/42] text2image Readme update --- samples/cpp/text2image/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/cpp/text2image/README.md b/samples/cpp/text2image/README.md index 2a08ad61b6..6c7b45d9dd 100644 --- a/samples/cpp/text2image/README.md +++ b/samples/cpp/text2image/README.md @@ -45,6 +45,7 @@ Models can be downloaded from [HuggingFace](https://huggingface.co/models). This - [stabilityai/stable-diffusion-2-1](https://huggingface.co/stabilityai/stable-diffusion-2-1) - [dreamlike-art/dreamlike-anime-1.0](https://huggingface.co/dreamlike-art/dreamlike-anime-1.0) - [SimianLuo/LCM_Dreamshaper_v7](https://huggingface.co/SimianLuo/LCM_Dreamshaper_v7) +- [stabilityai/stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0) ## Run with optional LoRA adapters From f4e90aaa9118da5588edc4aeb94b13ef7a829a94 Mon Sep 17 00:00:00 2001 From: likholat Date: Tue, 8 Oct 2024 15:31:37 +0200 Subject: [PATCH 35/42] num_images_per_prompt>1 for demo, unet reshape fix, num_hidden_layers for text_encoder --- samples/cpp/text2image/main.cpp | 34 +++++++++++++++++-- .../genai/text2image/clip_text_model.hpp | 3 +- .../clip_text_model_with_projection.hpp | 1 + .../clip_text_model_with_projection.cpp | 2 +- .../models/unet2d_condition_model.cpp | 2 +- src/cpp/src/text2image/numpy_utils.cpp | 6 ++-- src/cpp/src/text2image/numpy_utils.hpp | 6 ++-- .../stable_diffusion_xl_pipeline.hpp | 21 +++++++----- .../src/text2image/text2image_pipeline.cpp | 5 +-- 9 files changed, 57 insertions(+), 23 deletions(-) diff --git a/samples/cpp/text2image/main.cpp b/samples/cpp/text2image/main.cpp index 05fc7a2535..8f55931ddb 100644 --- a/samples/cpp/text2image/main.cpp +++ b/samples/cpp/text2image/main.cpp @@ -5,6 +5,35 @@ #include "imwrite.hpp" +namespace { + + void imwrite_output_imgs(const ov::Tensor& output) { + ov::Shape out_shape = output.get_shape(); + + if (out_shape[0] == 1) { + imwrite("image.bmp", output, true); + return; + } + + ov::Shape img_shape = {1, out_shape[1], out_shape[2], out_shape[3]}; + size_t img_size = output.get_size() / out_shape[0]; + + ov::Tensor image(output.get_element_type(), img_shape); + u_int8_t* out_data = output.data(); + u_int8_t* img_data = image.data(); + + for (size_t img_num = 0; img_num < out_shape[0]; ++img_num) { + std::memcpy(img_data, out_data + img_size*img_num, img_size * sizeof(u_int8_t)); + + std::stringstream img_name; + img_name << "image_" << img_num << ".bmp"; + + imwrite(img_name.str(), image, true); + } + } + +} //namespace + int32_t main(int32_t argc, char* argv[]) try { OPENVINO_ASSERT(argc == 3, "Usage: ", argv[0], " ''"); @@ -15,9 +44,10 @@ int32_t main(int32_t argc, char* argv[]) try { ov::Tensor image = pipe.generate(prompt, ov::genai::width(512), ov::genai::height(512), - ov::genai::num_inference_steps(20)); + ov::genai::num_inference_steps(20), + ov::genai::num_images_per_prompt(1)); - imwrite("image.bmp", image, true); + imwrite_output_imgs(image); return EXIT_SUCCESS; } catch (const std::exception& error) { diff --git a/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp b/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp index b7011207ca..1f79b039d7 100644 --- a/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp +++ b/src/cpp/include/openvino/genai/text2image/clip_text_model.hpp @@ -22,6 +22,7 @@ class OPENVINO_GENAI_EXPORTS CLIPTextModel { struct Config { size_t max_position_embeddings = 77; size_t hidden_size = 512; + size_t num_hidden_layers = 13; explicit Config(const std::string& config_path); }; @@ -58,8 +59,6 @@ class OPENVINO_GENAI_EXPORTS CLIPTextModel { ov::Tensor infer(const std::string& pos_prompt, const std::string& neg_prompt, bool do_classifier_free_guidance); - // ov::Tensor get_tensor(const std::string& output); - ov::Tensor get_output_tensor(const size_t idx); private: diff --git a/src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp b/src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp index 5fb17aafa6..e46e76f316 100644 --- a/src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp +++ b/src/cpp/include/openvino/genai/text2image/clip_text_model_with_projection.hpp @@ -21,6 +21,7 @@ class OPENVINO_GENAI_EXPORTS CLIPTextModelWithProjection { struct Config { size_t max_position_embeddings = 77; size_t hidden_size = 512; + size_t num_hidden_layers = 33; explicit Config(const std::string& config_path); }; diff --git a/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp b/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp index 446a63fd56..630e9feeb2 100644 --- a/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp +++ b/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp @@ -24,7 +24,7 @@ CLIPTextModelWithProjection::Config::Config(const std::string& config_path) { } CLIPTextModelWithProjection::CLIPTextModelWithProjection(const std::string root_dir) : - m_clip_tokenizer(root_dir + "/../tokenizer"), + m_clip_tokenizer(root_dir + "/../tokenizer_2"), m_config(root_dir + "/config.json") { m_model = ov::Core().read_model(root_dir + "/openvino_model.xml"); } diff --git a/src/cpp/src/text2image/models/unet2d_condition_model.cpp b/src/cpp/src/text2image/models/unet2d_condition_model.cpp index ebc284d620..d356515678 100644 --- a/src/cpp/src/text2image/models/unet2d_condition_model.cpp +++ b/src/cpp/src/text2image/models/unet2d_condition_model.cpp @@ -71,7 +71,7 @@ UNet2DConditionModel& UNet2DConditionModel::reshape(int batch_size, int height, name_to_shape[input_name][0] = 1; } else if (input_name == "sample") { name_to_shape[input_name] = {batch_size, name_to_shape[input_name][1], height, width}; - } else if (input_name == "time_ids") { + } else if (input_name == "time_ids" || input_name == "text_embeds") { name_to_shape[input_name][0] = batch_size; } else if (input_name == "encoder_hidden_states") { name_to_shape[input_name][0] = batch_size; diff --git a/src/cpp/src/text2image/numpy_utils.cpp b/src/cpp/src/text2image/numpy_utils.cpp index 834d952092..9554681820 100644 --- a/src/cpp/src/text2image/numpy_utils.cpp +++ b/src/cpp/src/text2image/numpy_utils.cpp @@ -74,6 +74,6 @@ std::vector interp(const std::vector& x, const std::vector< return interp_res; } -}// namespace ov -}// namespace genai -}// namespace txt2img_utils +} // namespace ov +} // namespace genai +} // namespace numpy_utils diff --git a/src/cpp/src/text2image/numpy_utils.hpp b/src/cpp/src/text2image/numpy_utils.hpp index 99f26b77ab..b95d9e4380 100644 --- a/src/cpp/src/text2image/numpy_utils.hpp +++ b/src/cpp/src/text2image/numpy_utils.hpp @@ -43,6 +43,6 @@ void rescale_zero_terminal_snr(std::vector& betas); // np.interp(...) implementation std::vector interp(const std::vector& x, const std::vector& xp, const std::vector& fp); -}// namespace ov -}// namespace genai -}// namespace txt2img_utils +} // namespace ov +} // namespace genai +} // namespace numpy_utils diff --git a/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp b/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp index 5d80d59aea..3d42a8309e 100644 --- a/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp +++ b/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp @@ -113,7 +113,7 @@ class Text2ImagePipeline::StableDiffusionXLPipeline : public Text2ImagePipeline: const size_t batch_size_multiplier = do_classifier_free_guidance(guidance_scale) ? 2 : 1; // Unet accepts 2x batch in case of CFG m_clip_text_encoder->reshape(batch_size_multiplier); - // TODO: m_unet reshape + m_clip_text_encoder_with_projection->reshape(batch_size_multiplier); m_unet->reshape(num_images_per_prompt * batch_size_multiplier, height, width, m_clip_text_encoder->get_config().max_position_embeddings); m_vae_decoder->reshape(num_images_per_prompt, height, width); } @@ -164,23 +164,24 @@ class Text2ImagePipeline::StableDiffusionXLPipeline : public Text2ImagePipeline: } ov::Tensor add_text_embeds = m_clip_text_encoder_with_projection->infer(positive_prompt, generation_config.negative_prompt, batch_size_multiplier > 1); - m_clip_text_encoder->infer(positive_prompt, generation_config.negative_prompt, batch_size_multiplier > 1); - // ov::Tensor encoder_hidden_states_1 = m_clip_text_encoder->get_tensor("hidden_states.11"); - ov::Tensor encoder_hidden_states_1 = m_clip_text_encoder->get_output_tensor(13); - // ov::Tensor encoder_hidden_states_2 = m_clip_text_encoder_with_projection->get_tensor("hidden_states.31"); - ov::Tensor encoder_hidden_states_2 = m_clip_text_encoder_with_projection->get_output_tensor(33); + // prompt_embeds = prompt_embeds.hidden_states[-2] + size_t idx_hidden_state_1 = m_clip_text_encoder->get_config().num_hidden_layers; + ov::Tensor encoder_hidden_states_1 = m_clip_text_encoder->get_output_tensor(idx_hidden_state_1); + size_t idx_hidden_state_2 = m_clip_text_encoder_with_projection->get_config().num_hidden_layers; + ov::Tensor encoder_hidden_states_2 = m_clip_text_encoder_with_projection->get_output_tensor(idx_hidden_state_2); ov::Shape ehs_1_shape = encoder_hidden_states_1.get_shape(); ov::Shape ehs_2_shape = encoder_hidden_states_2.get_shape(); OPENVINO_ASSERT(ehs_1_shape[0] == ehs_2_shape[0] && ehs_1_shape[1] == ehs_2_shape[1], - "Tensors for concatenation must have the same dimensions"); + "Tensors for concatenation must have the same dimensions"); + // concatenate hidden_states from two encoders ov::Shape encoder_hidden_states_shape = {ehs_1_shape[0], ehs_1_shape[1], ehs_1_shape[2] + ehs_2_shape[2]}; ov::Tensor encoder_hidden_states(encoder_hidden_states_1.get_element_type(), encoder_hidden_states_shape); - + const float* ehs_1_data = encoder_hidden_states_1.data(); const float* ehs_2_data = encoder_hidden_states_2.data(); float* encoder_hidden_states_data = encoder_hidden_states.data(); @@ -197,6 +198,8 @@ class Text2ImagePipeline::StableDiffusionXLPipeline : public Text2ImagePipeline: } } + + // replicate encoder hidden state to UNet model if (generation_config.num_images_per_prompt == 1) { // reuse output of text encoder directly w/o extra memory copy @@ -320,7 +323,7 @@ class Text2ImagePipeline::StableDiffusionXLPipeline : public Text2ImagePipeline: m_generation_config.width = unet_config.sample_size * vae_scale_factor; if (class_name == "StableDiffusionXLPipeline") { - m_generation_config.guidance_scale = 7.5f; + m_generation_config.guidance_scale = 5.0f; m_generation_config.num_inference_steps = 50; } else { OPENVINO_THROW("Unsupported class_name '", class_name, "'. Please, contact OpenVINO GenAI developers"); diff --git a/src/cpp/src/text2image/text2image_pipeline.cpp b/src/cpp/src/text2image/text2image_pipeline.cpp index 77d94ffc5c..f7a6ab65ae 100644 --- a/src/cpp/src/text2image/text2image_pipeline.cpp +++ b/src/cpp/src/text2image/text2image_pipeline.cpp @@ -62,9 +62,10 @@ Text2ImagePipeline::Text2ImagePipeline(const std::string& root_dir) { const std::string class_name = get_class_name(root_dir); if (class_name == "StableDiffusionPipeline" || - class_name == "LatentConsistencyModelPipeline"|| - class_name == "StableDiffusionXLPipeline") { + class_name == "LatentConsistencyModelPipeline") { m_impl = std::make_shared(root_dir); + } else if (class_name == "StableDiffusionXLPipeline") { + m_impl = std::make_shared(root_dir); } else { OPENVINO_THROW("Unsupported text to image generation pipeline '", class_name, "'"); } From ea8b9fa4742d507654bc51e29454e7e129cb7438 Mon Sep 17 00:00:00 2001 From: likholat Date: Tue, 8 Oct 2024 16:42:59 +0200 Subject: [PATCH 36/42] Readme update --- samples/cpp/text2image/README.md | 1 + samples/cpp/text2image/main.cpp | 10 +++++----- src/cpp/src/text2image/models/clip_text_model.cpp | 1 + .../models/clip_text_model_with_projection.cpp | 1 + 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/samples/cpp/text2image/README.md b/samples/cpp/text2image/README.md index 6c7b45d9dd..f73da334f4 100644 --- a/samples/cpp/text2image/README.md +++ b/samples/cpp/text2image/README.md @@ -46,6 +46,7 @@ Models can be downloaded from [HuggingFace](https://huggingface.co/models). This - [dreamlike-art/dreamlike-anime-1.0](https://huggingface.co/dreamlike-art/dreamlike-anime-1.0) - [SimianLuo/LCM_Dreamshaper_v7](https://huggingface.co/SimianLuo/LCM_Dreamshaper_v7) - [stabilityai/stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0) +- [stabilityai/stable-diffusion-xl-base-0.9](https://huggingface.co/stabilityai/stable-diffusion-xl-base-0.9) ## Run with optional LoRA adapters diff --git a/samples/cpp/text2image/main.cpp b/samples/cpp/text2image/main.cpp index 8f55931ddb..d098d87daa 100644 --- a/samples/cpp/text2image/main.cpp +++ b/samples/cpp/text2image/main.cpp @@ -22,13 +22,13 @@ namespace { u_int8_t* out_data = output.data(); u_int8_t* img_data = image.data(); - for (size_t img_num = 0; img_num < out_shape[0]; ++img_num) { - std::memcpy(img_data, out_data + img_size*img_num, img_size * sizeof(u_int8_t)); + for (int img_num = 0; img_num < out_shape[0]; ++img_num) { + std::memcpy(img_data, out_data + img_size * img_num, img_size * sizeof(u_int8_t)); - std::stringstream img_name; - img_name << "image_" << img_num << ".bmp"; + char img_name[25]; + sprintf(img_name, "image_%d.bmp", img_num); - imwrite(img_name.str(), image, true); + imwrite(img_name, image, true); } } diff --git a/src/cpp/src/text2image/models/clip_text_model.cpp b/src/cpp/src/text2image/models/clip_text_model.cpp index 5d75527705..b8ec871eb0 100644 --- a/src/cpp/src/text2image/models/clip_text_model.cpp +++ b/src/cpp/src/text2image/models/clip_text_model.cpp @@ -22,6 +22,7 @@ CLIPTextModel::Config::Config(const std::string& config_path) { read_json_param(data, "max_position_embeddings", max_position_embeddings); read_json_param(data, "hidden_size", hidden_size); + read_json_param(data, "num_hidden_layers", num_hidden_layers); } CLIPTextModel::CLIPTextModel(const std::string root_dir) : diff --git a/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp b/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp index 630e9feeb2..2fa7b83738 100644 --- a/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp +++ b/src/cpp/src/text2image/models/clip_text_model_with_projection.cpp @@ -21,6 +21,7 @@ CLIPTextModelWithProjection::Config::Config(const std::string& config_path) { read_json_param(data, "max_position_embeddings", max_position_embeddings); read_json_param(data, "hidden_size", hidden_size); + read_json_param(data, "num_hidden_layers", num_hidden_layers); } CLIPTextModelWithProjection::CLIPTextModelWithProjection(const std::string root_dir) : From df2161d55dc8da7ea52e03d2c67de084ed8ec11d Mon Sep 17 00:00:00 2001 From: likholat Date: Tue, 8 Oct 2024 17:01:23 +0200 Subject: [PATCH 37/42] codestyle fixes --- .../include/openvino/genai/text2image/pipeline.hpp | 11 +++++------ src/cpp/src/text2image/numpy_utils.hpp | 1 - .../src/text2image/stable_diffusion_xl_pipeline.hpp | 3 --- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/cpp/include/openvino/genai/text2image/pipeline.hpp b/src/cpp/include/openvino/genai/text2image/pipeline.hpp index 3a47ce3385..5ce6a08b11 100644 --- a/src/cpp/include/openvino/genai/text2image/pipeline.hpp +++ b/src/cpp/include/openvino/genai/text2image/pipeline.hpp @@ -110,11 +110,10 @@ class OPENVINO_GENAI_EXPORTS Text2ImagePipeline { // creates either LCM or SD pipeline from building blocks static Text2ImagePipeline stable_diffusion( - const std::shared_ptr& scheduler_type, // scheduler - const CLIPTextModel& clip_text_model, // text_encoder - const UNet2DConditionModel& unet, // unet - const AutoencoderKL& vae_decoder); // vae - + const std::shared_ptr& scheduler_type, + const CLIPTextModel& clip_text_model, + const UNet2DConditionModel& unet, + const AutoencoderKL& vae_decoder); // creates either LCM or SD pipeline from building blocks static Text2ImagePipeline latent_consistency_model( @@ -123,7 +122,7 @@ class OPENVINO_GENAI_EXPORTS Text2ImagePipeline { const UNet2DConditionModel& unet, const AutoencoderKL& vae_decoder); - // creates either SDXL pipeline from building blocks + // creates SDXL pipeline from building blocks static Text2ImagePipeline stable_diffusion_xl( const std::shared_ptr& scheduler_type, const CLIPTextModel& clip_text_model, diff --git a/src/cpp/src/text2image/numpy_utils.hpp b/src/cpp/src/text2image/numpy_utils.hpp index b95d9e4380..d6144eeb99 100644 --- a/src/cpp/src/text2image/numpy_utils.hpp +++ b/src/cpp/src/text2image/numpy_utils.hpp @@ -10,7 +10,6 @@ #include #include - namespace ov { namespace genai { namespace numpy_utils { diff --git a/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp b/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp index 3d42a8309e..95ea2abc5d 100644 --- a/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp +++ b/src/cpp/src/text2image/stable_diffusion_xl_pipeline.hpp @@ -8,7 +8,6 @@ #include "utils.hpp" - namespace ov { namespace genai { @@ -198,8 +197,6 @@ class Text2ImagePipeline::StableDiffusionXLPipeline : public Text2ImagePipeline: } } - - // replicate encoder hidden state to UNet model if (generation_config.num_images_per_prompt == 1) { // reuse output of text encoder directly w/o extra memory copy From 8db03012ffa053143355e4544403e16de1d895e5 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 8 Oct 2024 20:08:52 +0400 Subject: [PATCH 38/42] Apply suggestions from code review Fixed compilation --- samples/cpp/text2image/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/cpp/text2image/main.cpp b/samples/cpp/text2image/main.cpp index d098d87daa..02c632d53e 100644 --- a/samples/cpp/text2image/main.cpp +++ b/samples/cpp/text2image/main.cpp @@ -19,11 +19,11 @@ namespace { size_t img_size = output.get_size() / out_shape[0]; ov::Tensor image(output.get_element_type(), img_shape); - u_int8_t* out_data = output.data(); - u_int8_t* img_data = image.data(); + uint8_t* out_data = output.data(); + uint8_t* img_data = image.data(); for (int img_num = 0; img_num < out_shape[0]; ++img_num) { - std::memcpy(img_data, out_data + img_size * img_num, img_size * sizeof(u_int8_t)); + std::memcpy(img_data, out_data + img_size * img_num, img_size * sizeof(uint8_t)); char img_name[25]; sprintf(img_name, "image_%d.bmp", img_num); From b9eed0a0c03a59b954059f748227de8c57f1895a Mon Sep 17 00:00:00 2001 From: Anastasiia Pnevskaia Date: Wed, 9 Oct 2024 08:26:59 +0200 Subject: [PATCH 39/42] Added VLM bindings and a Python sample. (#914) - Added VLM bindings. - Added Python VLM chat sample. - Added initialization of performance metrics with zeros. Tickets: CVS-153174, CVS-153173, CVS-153626 PR to miniCPM-V-2_6 branch: https://github.com/Wovchena/openvino.genai-public/pull/62 --------- Co-authored-by: wenyi5608 <93560477+wenyi5608@users.noreply.github.com> Co-authored-by: Yang,Su Co-authored-by: Wovchena Co-authored-by: Yaroslav Tarkan Co-authored-by: Alina Kladieva Co-authored-by: Pavel Esir Co-authored-by: Pavel Esir Co-authored-by: Artur Paniukov Co-authored-by: Ekaterina Aidova Co-authored-by: Ilya Lavrenov Co-authored-by: Mikhail Ryzhov --- .github/workflows/causal_lm_cpp.yml | 7 +- samples/python/vlm_chat_sample/README.md | 38 ++++ .../python/vlm_chat_sample/vlm_chat_sample.py | 68 ++++++ samples/requirements.txt | 3 +- .../include/openvino/genai/llm_pipeline.hpp | 2 +- src/cpp/src/vlm_pipeline.cpp | 21 +- src/python/CMakeLists.txt | 2 +- src/python/openvino_genai/__init__.py | 3 +- src/python/py_generate_pipeline.cpp | 88 +------- src/python/py_vlm_pipeline.cpp | 199 ++++++++++++++++++ src/python/py_whisper_pipeline.cpp | 18 +- src/python/utils.cpp | 83 ++++++++ src/python/utils.hpp | 5 + 13 files changed, 431 insertions(+), 106 deletions(-) create mode 100644 samples/python/vlm_chat_sample/README.md create mode 100644 samples/python/vlm_chat_sample/vlm_chat_sample.py create mode 100644 src/python/py_vlm_pipeline.cpp diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index fe360985d2..07352c0818 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -14,6 +14,7 @@ concurrency: env: l_ov_link: https://storage.openvinotoolkit.org/repositories/openvino/packages/nightly/2024.5.0-16570-19eb02fe60b/l_openvino_toolkit_ubuntu20_2024.5.0.dev20240830_x86_64.tgz + l_u22_ov_link: https://storage.openvinotoolkit.org/repositories/openvino/packages/nightly/2024.5.0-16570-19eb02fe60b/l_openvino_toolkit_ubuntu22_2024.5.0.dev20240830_x86_64.tgz m_ov_link: https://storage.openvinotoolkit.org/repositories/openvino/packages/nightly/2024.5.0-16570-19eb02fe60b/m_openvino_toolkit_macos_12_6_2024.5.0.dev20240830_x86_64.tgz w_ov_link: https://storage.openvinotoolkit.org/repositories/openvino/packages/nightly/2024.5.0-16570-19eb02fe60b/w_openvino_toolkit_windows_2024.5.0.dev20240830_x86_64.zip jobs: @@ -694,7 +695,7 @@ jobs: - name: Install OpenVINO run: | mkdir ./ov/ - curl ${{ env.l_ov_link }} | tar --directory ./ov/ --strip-components 1 -xz + curl ${{ env.l_u22_ov_link }} | tar --directory ./ov/ --strip-components 1 -xz sudo ./ov/install_dependencies/install_openvino_dependencies.sh - name: Build app run: | @@ -708,7 +709,9 @@ jobs: python -m pip install --upgrade-strategy eager -r ./samples/requirements.txt --pre --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly python ./samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py ./miniCPM-V-2_6/ wget https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11 - - run: > + + - name: Run chat chat sample + run: > source ./ov/setupvars.sh && timeout 120s ./build/samples/cpp/visual_language_chat/visual_language_chat ./miniCPM-V-2_6/ d5fbbd1a-d484-415c-88cb-9986625b7b11 <<< $'What is on the image?\nWhat is special on the image?' diff --git a/samples/python/vlm_chat_sample/README.md b/samples/python/vlm_chat_sample/README.md new file mode 100644 index 0000000000..246cbe3cd8 --- /dev/null +++ b/samples/python/vlm_chat_sample/README.md @@ -0,0 +1,38 @@ +# Python vlm_chat_sample that supports VLM models + +This example showcases inference of text-generation Vision Language Models (VLMs): `miniCPM-V-2_6` and other models with the same signature. The application doesn't have many configuration options to encourage the reader to explore and modify the source code. For example, change the device for inference to GPU. The sample features `openvino_genai.VLMPipeline` and configures it for the chat scenario. There is also a Jupyter [notebook](https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/minicpm-v-multimodal-chatbot) which provides an example of Visual-language assistant. + +## Download and convert the model and tokenizers + +The `--upgrade-strategy eager` option is needed to ensure `optimum-intel` is upgraded to the latest version. + +It's not required to install [../../requirements.txt](../../requirements.txt) for deployment if the model has already been exported. + +```sh +pip install --upgrade-strategy eager -r ../../requirements.txt +``` +# TODO: add optimum cli command for miniCPM-V-2_6 when available + +## Run: +[This image](https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11) can be used as a sample image. + +`vlm_chat_sample.py ./miniCPM-V-2_6/ 319483352-d5fbbd1a-d484-415c-88cb-9986625b7b11.jpg` + + +Discrete GPUs (dGPUs) usually provide better performance compared to CPUs. It is recommended to run larger models on a dGPU with 32GB+ RAM. # TODO: examples of larger models +Modify the source code to change the device for inference to the GPU. + +See https://github.com/openvinotoolkit/openvino.genai/blob/master/src/README.md#supported-models for the list of supported models. + +### Troubleshooting + +#### Unicode characters encoding error on Windows + +Example error: +``` +UnicodeEncodeError: 'charmap' codec can't encode character '\u25aa' in position 0: character maps to +``` + +If you encounter the error described in the example when sample is printing output to the Windows console, it is likely due to the default Windows encoding not supporting certain Unicode characters. To resolve this: +1. Enable Unicode characters for Windows cmd - open `Region` settings from `Control panel`. `Administrative`->`Change system locale`->`Beta: Use Unicode UTF-8 for worldwide language support`->`OK`. Reboot. +2. Enable UTF-8 mode by setting environment variable `PYTHONIOENCODING="utf8"`. diff --git a/samples/python/vlm_chat_sample/vlm_chat_sample.py b/samples/python/vlm_chat_sample/vlm_chat_sample.py new file mode 100644 index 0000000000..686fae939f --- /dev/null +++ b/samples/python/vlm_chat_sample/vlm_chat_sample.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +# Copyright (C) 2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +import argparse + +import numpy as np +import openvino_genai +from PIL import Image +from openvino import Tensor + + +def streamer(subword: str) -> bool: + ''' + + Args: + subword: sub-word of the generated text. + + Returns: Return flag corresponds whether generation should be stopped. + + ''' + print(subword, end='', flush=True) + + # No value is returned as in this example we don't want to stop the generation in this method. + # "return None" will be treated the same as "return False". + + +def read_image(path: str) -> Tensor: + ''' + + Args: + path: The path to the image. + + Returns: the ov.Tensor containing the image. + + ''' + pic = Image.open(path) + image_data = np.array(pic.getdata()).reshape(1, 3, pic.size[1], pic.size[0]).astype(np.byte) + return Tensor(image_data) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('model_dir') + parser.add_argument('image_dir') + args = parser.parse_args() + + image = read_image(args.image_dir) + + device = 'CPU' # GPU can be used as well + pipe = openvino_genai.VLMPipeline(args.model_dir, device) + + config = openvino_genai.GenerationConfig() + config.max_new_tokens = 100 + + pipe.start_chat() + while True: + try: + prompt = input('question:\n') + except EOFError: + break + pipe(prompt, image=image, generation_config=config, streamer=streamer) + print('\n----------') + pipe.finish_chat() + + +if '__main__' == __name__: + main() diff --git a/samples/requirements.txt b/samples/requirements.txt index b8cc30895e..18145bed85 100644 --- a/samples/requirements.txt +++ b/samples/requirements.txt @@ -3,4 +3,5 @@ optimum[openvino]==1.22.0 einops==0.8.0 # For Qwen transformers_stream_generator==0.0.5 # For Qwen diffusers==0.30.3 -torchvision +pillow +torchvision # needed for mini-CPM export script. Need to remove when we switch to exporting with optimum-intel. diff --git a/src/cpp/include/openvino/genai/llm_pipeline.hpp b/src/cpp/include/openvino/genai/llm_pipeline.hpp index a14dd1dde0..b21fb43bdb 100644 --- a/src/cpp/include/openvino/genai/llm_pipeline.hpp +++ b/src/cpp/include/openvino/genai/llm_pipeline.hpp @@ -270,7 +270,7 @@ class OPENVINO_GENAI_EXPORTS LLMPipeline { }; OPENVINO_GENAI_EXPORTS std::pair streamer(StreamerVariant func); -std::pair generation_config(const GenerationConfig& config); +OPENVINO_GENAI_EXPORTS std::pair generation_config(const GenerationConfig& config); } // namespace genai } // namespace ov diff --git a/src/cpp/src/vlm_pipeline.cpp b/src/cpp/src/vlm_pipeline.cpp index 89eb535aa7..5910d54bd8 100644 --- a/src/cpp/src/vlm_pipeline.cpp +++ b/src/cpp/src/vlm_pipeline.cpp @@ -533,8 +533,25 @@ DecodedResults VLMPipeline::generate( variable.reset(); } m_language.get_tensor("attention_mask").set_shape({1, 0}); - } - return {{m_tokenizer.decode(generated)}}; + } + DecodedResults results; + results.texts = {m_tokenizer.decode(generated)}; + + // TODO: implement performance metrics + results.perf_metrics = ov::genai::PerfMetrics(); + results.perf_metrics.m_evaluated = false; + results.perf_metrics.generate_duration = {0, 0}; + results.perf_metrics.inference_duration= {0, 0}; + results.perf_metrics.tokenization_duration = {0, 0}; + results.perf_metrics.detokenization_duration= {0, 0}; + results.perf_metrics.ttft = {0, 0}; + results.perf_metrics.tpot= {0, 0}; + results.perf_metrics.ipot= {0, 0}; + results.perf_metrics.throughput= {0, 0}; + results.perf_metrics.num_generated_tokens = generated.size(); + results.perf_metrics.num_input_tokens= 0; + + return results; } DecodedResults VLMPipeline::generate( diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index c032ca1a55..bf76f34f4f 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -18,7 +18,7 @@ if(NOT pybind11_POPULATED) add_subdirectory(${pybind11_SOURCE_DIR} ${pybind11_BINARY_DIR}) endif() -pybind11_add_module(py_generate_pipeline py_generate_pipeline.cpp py_whisper_pipeline.cpp utils.cpp) +pybind11_add_module(py_generate_pipeline py_vlm_pipeline.cpp py_generate_pipeline.cpp py_whisper_pipeline.cpp utils.cpp) target_link_libraries(py_generate_pipeline PRIVATE openvino::genai) set_target_properties(py_generate_pipeline PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "$<1:${CMAKE_BINARY_DIR}/openvino_genai/>" diff --git a/src/python/openvino_genai/__init__.py b/src/python/openvino_genai/__init__.py index c4d219fcf4..879dfc8262 100644 --- a/src/python/openvino_genai/__init__.py +++ b/src/python/openvino_genai/__init__.py @@ -17,7 +17,8 @@ EncodedResults, GenerationConfig, GenerationResult, - LLMPipeline, + LLMPipeline, + VLMPipeline, PerfMetrics, RawPerfMetrics, SchedulerConfig, diff --git a/src/python/py_generate_pipeline.cpp b/src/python/py_generate_pipeline.cpp index 74b704f34b..b636253e33 100644 --- a/src/python/py_generate_pipeline.cpp +++ b/src/python/py_generate_pipeline.cpp @@ -50,6 +50,7 @@ std::vector get_ms(const T& instance, U T::*member) { } void init_whisper_pipeline(py::module_& m); +void init_vlm_pipeline(py::module_& m); namespace { @@ -310,68 +311,6 @@ auto cache_eviction_config_docstring = R"( :type aggregation_mode: openvino_genai.AggregationMode )"; -OptionalGenerationConfig update_config_from_kwargs(const OptionalGenerationConfig& config, const py::kwargs& kwargs) { - if(!config.has_value() && kwargs.empty()) - return std::nullopt; - - GenerationConfig res_config; - if(config.has_value()) - res_config = *config; - - for (const auto& item : kwargs) { - std::string key = py::cast(item.first); - py::object value = py::cast(item.second); - - if (item.second.is_none()) { - // Even if argument key name does not fit GenerationConfig name - // it's not an eror if it's not defined. - // Some HF configs can have parameters for methods currenly unsupported in ov_genai - // but if their values are not set / None, then this should not block - // us from reading such configs, e.g. {"typical_p": None, 'top_p': 1.0,...} - return res_config; - } - - if (key == "max_new_tokens") { - res_config.max_new_tokens = py::cast(item.second); - } else if (key == "max_length") { - res_config.max_length = py::cast(item.second); - } else if (key == "ignore_eos") { - res_config.ignore_eos = py::cast(item.second); - } else if (key == "num_beam_groups") { - res_config.num_beam_groups = py::cast(item.second); - } else if (key == "num_beams") { - res_config.num_beams = py::cast(item.second); - } else if (key == "diversity_penalty") { - res_config.diversity_penalty = py::cast(item.second); - } else if (key == "length_penalty") { - res_config.length_penalty = py::cast(item.second); - } else if (key == "num_return_sequences") { - res_config.num_return_sequences = py::cast(item.second); - } else if (key == "no_repeat_ngram_size") { - res_config.no_repeat_ngram_size = py::cast(item.second); - } else if (key == "stop_criteria") { - res_config.stop_criteria = py::cast(item.second); - } else if (key == "temperature") { - res_config.temperature = py::cast(item.second); - } else if (key == "top_p") { - res_config.top_p = py::cast(item.second); - } else if (key == "top_k") { - res_config.top_k = py::cast(item.second); - } else if (key == "do_sample") { - res_config.do_sample = py::cast(item.second); - } else if (key == "repetition_penalty") { - res_config.repetition_penalty = py::cast(item.second); - } else if (key == "eos_token_id") { - res_config.set_eos_token_id(py::cast(item.second)); - } else { - throw(std::invalid_argument("'" + key + "' is incorrect GenerationConfig parameter name. " - "Use help(openvino_genai.GenerationConfig) to get list of acceptable parameters.")); - } - } - - return res_config; -} - py::list handle_utf8_results(const std::vector& decoded_res) { // pybind11 decodes strings similar to Pythons's // bytes.decode('utf-8'). It raises if the decoding fails. @@ -392,26 +331,10 @@ py::object call_common_generate( const utils::PyBindStreamerVariant& py_streamer, const py::kwargs& kwargs ) { - auto updated_config = update_config_from_kwargs(config, kwargs); + auto updated_config = ov::genai::pybind::utils::update_config_from_kwargs(config, kwargs); py::object results; EncodedInputs tensor_data; - StreamerVariant streamer = std::monostate(); - - std::visit(utils::overloaded { - [&streamer](const std::function& py_callback){ - // Wrap python streamer with manual utf-8 decoding. Do not rely - // on pybind automatic decoding since it raises exceptions on incomplete strings. - auto callback_wrapped = [&py_callback](std::string subword) -> bool { - auto py_str = PyUnicode_DecodeUTF8(subword.data(), subword.length(), "replace"); - return py_callback(py::reinterpret_borrow(py_str)); - }; - streamer = callback_wrapped; - }, - [&streamer](std::shared_ptr streamer_cls){ - streamer = streamer_cls; - }, - [](std::monostate none){ /*streamer is already a monostate */ } - }, py_streamer); + StreamerVariant streamer = ov::genai::pybind::utils::pystreamer_to_streamer(py_streamer); // Call suitable generate overload for each type of input. std::visit(utils::overloaded { @@ -635,7 +558,7 @@ PYBIND11_MODULE(py_generate_pipeline, m) { // Binding for GenerationConfig py::class_(m, "GenerationConfig", generation_config_docstring) .def(py::init(), py::arg("json_path"), "path where generation_config.json is stored") - .def(py::init([](py::kwargs kwargs) { return *update_config_from_kwargs(GenerationConfig(), kwargs); })) + .def(py::init([](py::kwargs kwargs) { return *ov::genai::pybind::utils::update_config_from_kwargs(GenerationConfig(), kwargs); })) .def_readwrite("max_new_tokens", &GenerationConfig::max_new_tokens) .def_readwrite("max_length", &GenerationConfig::max_length) .def_readwrite("ignore_eos", &GenerationConfig::ignore_eos) @@ -840,4 +763,7 @@ PYBIND11_MODULE(py_generate_pipeline, m) { // init whisper bindings init_whisper_pipeline(m); + + // init vlm pipeline + init_vlm_pipeline(m); } diff --git a/src/python/py_vlm_pipeline.cpp b/src/python/py_vlm_pipeline.cpp new file mode 100644 index 0000000000..8d6a5f0077 --- /dev/null +++ b/src/python/py_vlm_pipeline.cpp @@ -0,0 +1,199 @@ +// Copyright (C) 2023-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + + +#include +#include +#include +#include +#include +#include "openvino/genai/vlm_pipeline.hpp" +#include "../cpp/src/tokenizers_path.hpp" +#include "./utils.hpp" + +namespace py = pybind11; +namespace utils = ov::genai::pybind::utils; + + +auto vlm_generate_docstring = R"( + Generates sequences for VLMs. + + :param prompt: input prompt + :type prompt: str + + :param images: list of images + :type inputs: List[ov.Tensor] + + :param generation_config: generation_config + :type generation_config: GenerationConfig or a Dict + + :param streamer: streamer either as a lambda with a boolean returning flag whether generation should be stopped + :type : Callable[[str], bool], ov.genai.StreamerBase + + :param kwargs: arbitrary keyword arguments with keys corresponding to GenerationConfig fields. + :type : Dict + + :return: return results in decoded form + :rtype: DecodedResults +)"; + +auto vlm_generate_kwargs_docstring = R"( + Generates sequences for VLMs. + + :param prompt: input prompt + :type prompt: str + + :param kwargs: arbitrary keyword arguments with keys corresponding to generate params. + + Expected parameters list: + image: ov.Tensor - input image, + images: List[ov.Tensor] - input images, + generation_config: GenerationConfig, + streamer: Callable[[str], bool], ov.genai.StreamerBase - streamer either as a lambda with a boolean returning flag whether generation should be stopped + + :return: return results in decoded form + :rtype: DecodedResults +)"; + +py::object call_vlm_generate( + ov::genai::VLMPipeline& pipe, + const std::string& prompt, + const std::vector& images, + const ov::genai::GenerationConfig& generation_config, + const utils::PyBindStreamerVariant& py_streamer, + const py::kwargs& kwargs +) { + auto updated_config = *ov::genai::pybind::utils::update_config_from_kwargs(generation_config, kwargs); + ov::genai::StreamerVariant streamer = ov::genai::pybind::utils::pystreamer_to_streamer(py_streamer); + + return py::cast(pipe.generate(prompt, images, updated_config, streamer)); +} + +py::object call_vlm_generate( + ov::genai::VLMPipeline& pipe, + const std::string& prompt, + const py::kwargs& kwargs +) { + ov::AnyMap params = {}; + + for (const auto& item : kwargs) { + std::string key = py::cast(item.first); + py::object value = py::cast(item.second); + + if (key == "images") { + params.insert({ov::genai::images(std::move(py::cast>(item.second)))}); + } else if (key == "image") { + params.insert({ov::genai::image(std::move(py::cast(item.second)))}); + } else if (key == "generation_config") { + params.insert({ov::genai::generation_config(std::move(py::cast(item.second)))}); + } else if (key == "streamer") { + auto py_streamer = py::cast(value); + params.insert({ov::genai::streamer(std::move(ov::genai::pybind::utils::pystreamer_to_streamer(py_streamer)))}); + + } else { + throw(std::invalid_argument("'" + key + "' is unexpected parameter name. " + "Use help(openvino_genai.VLMPipeline.generate) to get list of acceptable parameters.")); + } + } + + return py::cast(pipe.generate(prompt, params)); +} + +void init_vlm_pipeline(py::module_& m) { + py::class_(m, "VLMPipeline", "This class is used for generation with VLMs") + .def(py::init([]( + const std::string& model_path, + const std::string& device, + const std::map& config + ) { + ScopedVar env_manager(utils::ov_tokenizers_module_path()); + return std::make_unique(model_path, device, utils::properties_to_any_map(config)); + }), + py::arg("model_path"), "folder with exported model files", + py::arg("device") = "CPU", "device on which inference will be done", + py::arg("config") = ov::AnyMap({}), "openvino.properties map" + R"( + VLMPipeline class constructor. + model_path (str): Path to the folder with exported model files. + device (str): Device to run the model on (e.g., CPU, GPU). Default is 'CPU'. + )") + + .def(py::init([]( + const std::string& model_path, + const ov::genai::Tokenizer& tokenizer, + const std::string& device, + const std::map& config + ) { + ScopedVar env_manager(utils::ov_tokenizers_module_path()); + return std::make_unique(model_path, tokenizer, device, utils::properties_to_any_map(config)); + }), + py::arg("model_path"), + py::arg("tokenizer"), + py::arg("device") = "CPU", + py::arg("config") = ov::AnyMap({}), "openvino.properties map" + R"( + VLMPipeline class constructor for manualy created openvino_genai.Tokenizer. + model_path (str): Path to the folder with exported model files. + tokenizer (openvino_genai.Tokenizer): tokenizer object. + device (str): Device to run the model on (e.g., CPU, GPU). Default is 'CPU'. + )") + .def("start_chat", &ov::genai::VLMPipeline::start_chat, py::arg("system_message") = "") + .def("finish_chat", &ov::genai::VLMPipeline::finish_chat) + .def("get_generation_config", &ov::genai::VLMPipeline::get_generation_config) + .def( + "generate", + [](ov::genai::VLMPipeline& pipe, + const std::string& prompt, + const std::vector& images, + const ov::genai::GenerationConfig& generation_config, + const utils::PyBindStreamerVariant& streamer, + const py::kwargs& kwargs + ) { + return call_vlm_generate(pipe, prompt, images, generation_config, streamer, kwargs); + }, + py::arg("prompt"), "Input string", + py::arg("images"), "Input images", + py::arg("generation_config") = std::nullopt, "generation_config", + py::arg("streamer") = std::monostate(), "streamer", + (vlm_generate_docstring + std::string(" \n ")).c_str() + ) + .def( + "generate", + [](ov::genai::VLMPipeline& pipe, + const std::string& prompt, + const py::kwargs& kwargs + ) { + return call_vlm_generate(pipe, prompt, kwargs); + }, + py::arg("prompt"), "Input string", + (vlm_generate_kwargs_docstring + std::string(" \n ")).c_str() + ) + .def( + "__call__", + [](ov::genai::VLMPipeline& pipe, + const std::string& prompt, + const std::vector& images, + const ov::genai::GenerationConfig& generation_config, + const utils::PyBindStreamerVariant& streamer, + const py::kwargs& kwargs + ) { + return call_vlm_generate(pipe, prompt, images, generation_config, streamer, kwargs); + }, + py::arg("prompt"), "Input string", + py::arg("images"), "Input images", + py::arg("generation_config") = std::nullopt, "generation_config", + py::arg("streamer") = std::monostate(), "streamer", + (vlm_generate_docstring + std::string(" \n ")).c_str() + ) + .def( + "__call__", + [](ov::genai::VLMPipeline& pipe, + const std::string& prompt, + const py::kwargs& kwargs + ) { + return call_vlm_generate(pipe, prompt, kwargs); + }, + py::arg("prompt"), "Input string", + (vlm_generate_kwargs_docstring + std::string(" \n ")).c_str() + ); +} diff --git a/src/python/py_whisper_pipeline.cpp b/src/python/py_whisper_pipeline.cpp index b7c6756e89..5d354ef93c 100644 --- a/src/python/py_whisper_pipeline.cpp +++ b/src/python/py_whisper_pipeline.cpp @@ -170,23 +170,7 @@ py::object call_whisper_common_generate(WhisperPipeline& pipe, auto updated_config = update_whisper_config_from_kwargs(base_config, kwargs); - StreamerVariant streamer = std::monostate(); - - std::visit(utils::overloaded{[&streamer](const std::function& py_callback) { - // Wrap python streamer with manual utf-8 decoding. Do not rely - // on pybind automatic decoding since it raises exceptions on incomplete strings. - auto callback_wrapped = [&py_callback](std::string subword) -> bool { - auto py_str = - PyUnicode_DecodeUTF8(subword.data(), subword.length(), "replace"); - return py_callback(py::reinterpret_borrow(py_str)); - }; - streamer = callback_wrapped; - }, - [&streamer](std::shared_ptr streamer_cls) { - streamer = streamer_cls; - }, - [](std::monostate none) { /*streamer is already a monostate */ }}, - py_streamer); + StreamerVariant streamer = ov::genai::pybind::utils::pystreamer_to_streamer(py_streamer); return py::cast(pipe.generate(raw_speech_input, updated_config, streamer)); } diff --git a/src/python/utils.cpp b/src/python/utils.cpp index bf8f195766..65033d0866 100644 --- a/src/python/utils.cpp +++ b/src/python/utils.cpp @@ -161,4 +161,87 @@ std::string ov_tokenizers_module_path() { return py::str(py::module_::import("openvino_tokenizers").attr("_ext_path")); } +ov::genai::StreamerVariant pystreamer_to_streamer(const utils::PyBindStreamerVariant& py_streamer) { + ov::genai::StreamerVariant streamer = std::monostate(); + + std::visit(utils::overloaded { + [&streamer](const std::function& py_callback){ + // Wrap python streamer with manual utf-8 decoding. Do not rely + // on pybind automatic decoding since it raises exceptions on incomplete strings. + auto callback_wrapped = [py_callback](std::string subword) -> bool { + auto py_str = PyUnicode_DecodeUTF8(subword.data(), subword.length(), "replace"); + return py_callback(py::reinterpret_borrow(py_str)); + }; + streamer = callback_wrapped; + }, + [&streamer](std::shared_ptr streamer_cls){ + streamer = streamer_cls; + }, + [](std::monostate none){ /*streamer is already a monostate */ } + }, py_streamer); + return streamer; +} + +ov::genai::OptionalGenerationConfig update_config_from_kwargs(const ov::genai::OptionalGenerationConfig& config, const py::kwargs& kwargs) { + if(!config.has_value() && kwargs.empty()) + return std::nullopt; + + ov::genai::GenerationConfig res_config; + if(config.has_value()) + res_config = *config; + + for (const auto& item : kwargs) { + std::string key = py::cast(item.first); + py::object value = py::cast(item.second); + + if (item.second.is_none()) { + // Even if argument key name does not fit GenerationConfig name + // it's not an eror if it's not defined. + // Some HF configs can have parameters for methods currenly unsupported in ov_genai + // but if their values are not set / None, then this should not block + // us from reading such configs, e.g. {"typical_p": None, 'top_p': 1.0,...} + return res_config; + } + + if (key == "max_new_tokens") { + res_config.max_new_tokens = py::cast(item.second); + } else if (key == "max_length") { + res_config.max_length = py::cast(item.second); + } else if (key == "ignore_eos") { + res_config.ignore_eos = py::cast(item.second); + } else if (key == "num_beam_groups") { + res_config.num_beam_groups = py::cast(item.second); + } else if (key == "num_beams") { + res_config.num_beams = py::cast(item.second); + } else if (key == "diversity_penalty") { + res_config.diversity_penalty = py::cast(item.second); + } else if (key == "length_penalty") { + res_config.length_penalty = py::cast(item.second); + } else if (key == "num_return_sequences") { + res_config.num_return_sequences = py::cast(item.second); + } else if (key == "no_repeat_ngram_size") { + res_config.no_repeat_ngram_size = py::cast(item.second); + } else if (key == "stop_criteria") { + res_config.stop_criteria = py::cast(item.second); + } else if (key == "temperature") { + res_config.temperature = py::cast(item.second); + } else if (key == "top_p") { + res_config.top_p = py::cast(item.second); + } else if (key == "top_k") { + res_config.top_k = py::cast(item.second); + } else if (key == "do_sample") { + res_config.do_sample = py::cast(item.second); + } else if (key == "repetition_penalty") { + res_config.repetition_penalty = py::cast(item.second); + } else if (key == "eos_token_id") { + res_config.set_eos_token_id(py::cast(item.second)); + } else { + throw(std::invalid_argument("'" + key + "' is incorrect GenerationConfig parameter name. " + "Use help(openvino_genai.GenerationConfig) to get list of acceptable parameters.")); + } + } + + return res_config; +} + } // namespace ov::genai::pybind::utils diff --git a/src/python/utils.hpp b/src/python/utils.hpp index 0a18a9c5f9..4047bdcfe7 100644 --- a/src/python/utils.hpp +++ b/src/python/utils.hpp @@ -6,6 +6,7 @@ #include #include "openvino/genai/streamer_base.hpp" +#include "openvino/genai/llm_pipeline.hpp" namespace py = pybind11; using ov::genai::StreamerBase; @@ -33,4 +34,8 @@ std::map properties_to_any_map(const std::map Date: Wed, 9 Oct 2024 12:40:40 +0200 Subject: [PATCH 40/42] Prevent overwriting of the sampling strategy. (#937) --- .../python/who_what_benchmark/whowhatbench/text_evaluator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llm_bench/python/who_what_benchmark/whowhatbench/text_evaluator.py b/llm_bench/python/who_what_benchmark/whowhatbench/text_evaluator.py index a6453cb66f..436d2be034 100644 --- a/llm_bench/python/who_what_benchmark/whowhatbench/text_evaluator.py +++ b/llm_bench/python/who_what_benchmark/whowhatbench/text_evaluator.py @@ -199,7 +199,7 @@ def _generate_data(self, model, gen_answer_fn=None, generation_config=None): def default_gen_answer(model, tokenizer, prompt, max_new_tokens, crop_question): inputs = self.tokenizer(prompt, return_tensors="pt") - tokens = model.generate(**inputs, max_new_tokens=max_new_tokens) + tokens = model.generate(**inputs, do_sample=False, max_new_tokens=max_new_tokens) out = self.tokenizer.batch_decode(tokens, skip_special_tokens=True)[0] return out[len(prompt) :] if crop_question else out From 6d2763a81f8e71acd716ee5f15dd55a69bf2428c Mon Sep 17 00:00:00 2001 From: Vladimir Zlobin Date: Wed, 9 Oct 2024 17:28:00 +0400 Subject: [PATCH 41/42] Multiple images miniCPM-V-2_6 (#919) TODO: - [ ] Remove `ov::Core` from constructors. - [ ] Hide files and API. --------- Co-authored-by: wenyi5608 <93560477+wenyi5608@users.noreply.github.com> Co-authored-by: Yang,Su Co-authored-by: Yaroslav Tarkan Co-authored-by: Alina Kladieva Co-authored-by: Pavel Esir Co-authored-by: Pavel Esir Co-authored-by: Artur Paniukov Co-authored-by: Ekaterina Aidova Co-authored-by: Ilya Lavrenov Co-authored-by: Mikhail Ryzhov --- .github/workflows/causal_lm_cpp.yml | 3 +- samples/CMakeLists.txt | 3 +- .../cpp/visual_language_chat/CMakeLists.txt | 12 +- .../export_MiniCPM-V-2_6.py | 260 +++++++++++++++++- .../cpp/visual_language_chat/load_image.cpp | 6 +- samples/requirements.txt | 1 - .../openvino/genai/processor_config.hpp | 1 + src/cpp/src/clip.hpp | 2 + src/cpp/src/llm_pipeline.cpp | 20 +- src/cpp/src/utils.hpp | 14 + src/cpp/src/vision_encoder.cpp | 87 ++++-- src/cpp/src/vlm_pipeline.cpp | 157 +++++------ src/docs/BUILD.md | 4 +- thirdparty/openvino_tokenizers | 2 +- 14 files changed, 426 insertions(+), 146 deletions(-) diff --git a/.github/workflows/causal_lm_cpp.yml b/.github/workflows/causal_lm_cpp.yml index 07352c0818..73ce951164 100644 --- a/.github/workflows/causal_lm_cpp.yml +++ b/.github/workflows/causal_lm_cpp.yml @@ -683,7 +683,7 @@ jobs: diff pred2.txt ref.txt echo "Chat sample python" passed - py-vlm_chat_sample-ubuntu: + visual_language_chat_sample-ubuntu: runs-on: ubuntu-22.04-16-cores steps: - uses: actions/checkout@v4 @@ -859,6 +859,7 @@ jobs: cpp-beam_search_causal_lm-Qwen-7B-Chat, cpp-beam_search_causal_lm-Qwen1_5-7B-Chat, cpp-beam_search_causal_lm-Phi-2, cpp-beam_search_causal_lm-notus-7b-v1, cpp-speculative_decoding_lm-ubuntu, cpp-prompt_lookup_decoding_lm-ubuntu, cpp-Phi-1_5, cpp-greedy_causal_lm-redpajama-3b-chat, cpp-chat_sample-ubuntu, cpp-continuous-batching-ubuntu, + visual_language_chat_sample-ubuntu, cpp-continuous-batching-windows, cpp-continuous-batching-macos] if: ${{ always() }} runs-on: ubuntu-latest diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index f6a94dfca9..2a8f26ff4d 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -25,7 +25,8 @@ install(DIRECTORY cpp/greedy_causal_lm cpp/multinomial_causal_lm # Don't install prompt_lookup_decoding_lm and speculative_decoding_lm because they don't use openvino_genai library and arent verifyed yet. - # Don't install continuous_batching_accuracy and continuous_batching_benchmark because they depend on json. + # Don't install continuous_batching_accuracy and continuous_batching_benchmark because CB isn't ready. + cpp/visual_language_chat cpp/whisper_speech_recognition cpp/text2image cpp/lora_greedy_causal_lm diff --git a/samples/cpp/visual_language_chat/CMakeLists.txt b/samples/cpp/visual_language_chat/CMakeLists.txt index 0df2b5ab5c..9a1b21632f 100644 --- a/samples/cpp/visual_language_chat/CMakeLists.txt +++ b/samples/cpp/visual_language_chat/CMakeLists.txt @@ -1,9 +1,11 @@ # Copyright (C) 2023-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -find_package(OpenVINOGenAI REQUIRED PATHS - "${CMAKE_BINARY_DIR}" # Reuse the package from the build. - ${OpenVINO_DIR} # GenAI may be installed alogside OpenVINO. +find_package(OpenVINOGenAI REQUIRED + PATHS + "${CMAKE_BINARY_DIR}" # Reuse the package from the build. + ${OpenVINO_DIR} # GenAI may be installed alogside OpenVINO. + NO_CMAKE_FIND_ROOT_PATH ) file(DOWNLOAD @@ -14,11 +16,11 @@ file(DOWNLOAD add_executable(visual_language_chat visual_language_chat.cpp load_image.cpp) target_include_directories(visual_language_chat PRIVATE "${CMAKE_CURRENT_SOUCE_DIR}" "${CMAKE_BINARY_DIR}") target_link_libraries(visual_language_chat PRIVATE openvino::genai) + set_target_properties(visual_language_chat PROPERTIES - COMPILE_PDB_NAME chat_sample + COMPILE_PDB_NAME visual_language_chat # Ensure out of box LC_RPATH on macOS with SIP INSTALL_RPATH_USE_LINK_PATH ON) -target_compile_features(visual_language_chat PRIVATE cxx_std_11) install(TARGETS visual_language_chat RUNTIME DESTINATION samples_bin/ diff --git a/samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py b/samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py index a08c3ad55b..7d2f0f1175 100644 --- a/samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py +++ b/samples/cpp/visual_language_chat/export_MiniCPM-V-2_6.py @@ -9,22 +9,58 @@ from transformers import AutoModel, AutoTokenizer, AutoProcessor, TextIteratorStreamer from transformers.generation import GenerationMixin from transformers import AutoConfig, GenerationConfig -from transformers.modeling_outputs import CausalLMOutputWithPast +from transformers.modeling_outputs import CausalLMOutputWithPast, BaseModelOutputWithPooling +from transformers.modeling_attn_mask_utils import _prepare_4d_attention_mask from pathlib import Path from huggingface_hub import snapshot_download import types -from typing import Optional, Tuple, List +from typing import Optional, Tuple, List, Union from openvino.runtime import opset13 import openvino as ov import openvino_tokenizers import numpy as np import gc +from openvino.runtime.passes import Manager, MatcherPass, WrapType, Matcher +import time text_emb_path = Path("embed_tokens.xml") image_emb_path = Path("image_encoder.xml") resampler_path = Path("resampler.xml") llm_path = Path("language_model.xml") +class InsertSlice(MatcherPass): + def __init__(self): + MatcherPass.__init__(self) + self.model_changed = False + + param = WrapType("opset10.Result") + + def callback(matcher: Matcher) -> bool: + root = matcher.get_match_root() + if root is None: + return False + if len(root.get_output_partial_shape(0)) == 3: + parent = root.input_value(0).get_node() + grand_parent = parent.input_value(0).get_node() + + grand_parent_output = parent.input(0).get_source_output() + consumers = grand_parent_output.get_target_inputs() + start = np.array([0, -1, 0], dtype=np.int32) + stop = np.array([1, -2, grand_parent_output.get_partial_shape()[-1].get_length()], dtype=np.int32) + step = np.array([1, -1, 1], dtype=np.int32) + axes = np.array([0, 1, 2], dtype=np.int32) + slice = opset13.slice(grand_parent, start, stop, step, axes, name="inserted_slice") + for consumer in consumers: + consumer.replace_source_output(slice.output(0)) + self.model_changed = True + # Use new operation for additional matching + self.register_new_node(slice) + print("applied slice for lm head") + + return True + + self.register_matcher(Matcher(param, "InsertSlice"), callback) + def model_has_state(ov_model: ov.Model): return len(ov_model.get_sinks()) > 0 @@ -324,13 +360,151 @@ def convert_vision_encoder(model, model_dir): tgt_sizes = torch.tensor([[23, 45]]) if not (model_dir / image_emb_path).exists(): print("⌛ Convert Image embedding model") + def siglip_vis_embed_forward( + self, + pixel_values: torch.FloatTensor, + patch_attention_mask: torch.BoolTensor, + tgt_sizes: Optional[torch.IntTensor] = None, + position_ids: Optional[torch.FloatTensor] = None, + ) -> torch.Tensor: + patch_embeds = self.patch_embedding(pixel_values) + embeddings = patch_embeds.flatten(2).transpose(1, 2) + + if position_ids is None: + batch_size = pixel_values.size(0) + max_im_h, max_im_w = pixel_values.size(2), pixel_values.size(3) + max_nb_patches_h, max_nb_patches_w = max_im_h // self.patch_size, max_im_w // self.patch_size + boundaries = torch.arange(1 / self.num_patches_per_side, 1.0, 1 / self.num_patches_per_side) + position_ids = torch.full( + size=( + batch_size, + max_nb_patches_h * max_nb_patches_w, + ), + fill_value=0, + ) + + for batch_idx, p_attn_mask in enumerate(patch_attention_mask): + if tgt_sizes is not None: + nb_patches_h = tgt_sizes[batch_idx][0] + nb_patches_w = tgt_sizes[batch_idx][1] + else: + nb_patches_h = p_attn_mask[:, 0].sum() + nb_patches_w = p_attn_mask[0].sum() + + fractional_coords_h = torch.arange(0, 1 - 1e-6, 1 / nb_patches_h) + fractional_coords_w = torch.arange(0, 1 - 1e-6, 1 / nb_patches_w) + + bucket_coords_h = torch.bucketize(fractional_coords_h, boundaries, right=True) + bucket_coords_w = torch.bucketize(fractional_coords_w, boundaries, right=True) + + pos_ids = (bucket_coords_h[:, None] * self.num_patches_per_side + bucket_coords_w).flatten() + position_ids[batch_idx][p_attn_mask.view(-1).cpu()] = pos_ids + + position_ids = position_ids.to(self.position_embedding.weight.device) + + embeddings = embeddings + self.position_embedding(position_ids) + return embeddings + + def siglip_attn_forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + output_attentions: Optional[bool] = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + """Input shape: Batch x Time x Channel""" + + batch_size, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(batch_size, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(batch_size, q_len, self.num_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(batch_size, q_len, self.num_heads, self.head_dim).transpose(1, 2) + + attn_output = torch.nn.functional.scaled_dot_product_attention( + query_states, key_states, value_states, attention_mask, is_causal=attention_mask is None + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(batch_size, q_len, self.embed_dim) + + attn_output = self.out_proj(attn_output) + + return attn_output, None + + def siglip_transformer_forward( + self, + pixel_values, + patch_attention_mask: Optional[torch.BoolTensor] = None, + tgt_sizes: Optional[torch.IntTensor] = None, + position_ids: Optional[torch.FloatTensor] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPooling]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + batch_size = pixel_values.size(0) + if patch_attention_mask is None: + patch_attention_mask = torch.ones( + size=( + batch_size, + pixel_values.size(2) // self.config.patch_size, + pixel_values.size(3) // self.config.patch_size, + ), + dtype=torch.bool, + device=pixel_values.device, + ) + + hidden_states = self.embeddings( + pixel_values=pixel_values, patch_attention_mask=patch_attention_mask, tgt_sizes=tgt_sizes, position_ids=position_ids + ) + + patch_attention_mask = patch_attention_mask.view(batch_size, -1) + attention_mask = _prepare_4d_attention_mask(patch_attention_mask, hidden_states.dtype) if not self._use_flash_attention_2 else patch_attention_mask + + encoder_outputs = self.encoder( + inputs_embeds=hidden_states, + attention_mask=attention_mask, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + last_hidden_state = encoder_outputs[0] + last_hidden_state = self.post_layernorm(last_hidden_state) + + if not return_dict: + return (last_hidden_state, None) + encoder_outputs[1:] + + return BaseModelOutputWithPooling( + last_hidden_state=last_hidden_state, + pooler_output=None, + hidden_states=encoder_outputs.hidden_states, + attentions=encoder_outputs.attentions, + ) + + vpm = model.vpm + vpm.embeddings.forward = types.MethodType(siglip_vis_embed_forward, vpm.embeddings) + for layer in vpm.encoder.layers: + layer.self_attn.forward = types.MethodType(siglip_attn_forward, layer.self_attn) + vpm.forward = types.MethodType(siglip_transformer_forward, vpm) + pixel_values = torch.randn([1, 3, 14, 14490]) patch_attn_mask = torch.zeros((1, 1, 1035), dtype=torch.bool) patch_attn_mask[0, 0, : tgt_sizes[0][0] * tgt_sizes[0][1]] = True - ov_model = ov.convert_model(model.vpm, example_input={"pixel_values": pixel_values, "tgt_sizes": tgt_sizes, "patch_attention_mask": patch_attn_mask}) + position_ids = prepare_vis_position_ids( + pixel_values, patch_attn_mask, tgt_sizes, model.config.vision_config.patch_size, model.config.vision_config.image_size // model.config.patch_size + ) + ov_model = ov.convert_model(vpm, example_input={"pixel_values": pixel_values, "position_ids": position_ids, "patch_attention_mask": patch_attn_mask}) ov.save_model(ov_model, model_dir / image_emb_path) del ov_model cleanup_torchscript_cache() + gc.collect() print("✅ Image embedding model successfully converted") if not (model_dir / resampler_path).exists(): @@ -343,7 +517,9 @@ def resampler_forward(self, x, pos_embed, key_padding_mask): q = self.ln_q(self.query) # Q * D - out = self.attn(self._repeat(q, bs), x + pos_embed, x, key_padding_mask=key_padding_mask)[0] # Q * B * D # L * B * D + L * B * D + q_bs = q.unsqueeze(1).repeat(1, bs, 1) + + out = self.attn(q_bs, x + pos_embed, x, key_padding_mask=key_padding_mask)[0] # Q * B * D # L * B * D + L * B * D # out: Q * B * D x = out.permute(1, 0, 2) # B * Q * D @@ -369,6 +545,8 @@ def resampler_forward(self, x, pos_embed, key_padding_mask): ov.save_model(ov_model, model_dir / resampler_path) del ov_model cleanup_torchscript_cache() + del model.resampler + gc.collect() print("✅ Resampler model successfully converted") @@ -380,11 +558,38 @@ def copy_llm_files(model_dir, dst_dir): shutil.copy(model_dir / llm_path.parent / "modeling_navit_siglip.py", model_dir / dst_dir / "modeling_navit_siglip.py") +def prepare_vis_position_ids(pixel_values, patch_attention_mask, tgt_sizes, patch_size, num_patches_per_side): + batch_size = pixel_values.size(0) + max_im_h, max_im_w = pixel_values.size(2), pixel_values.size(3) + max_nb_patches_h, max_nb_patches_w = max_im_h // patch_size, max_im_w // patch_size + boundaries = torch.arange(1 / num_patches_per_side, 1.0, 1 / num_patches_per_side) + position_ids = torch.full(size=(batch_size, max_nb_patches_h * max_nb_patches_w), fill_value=0) + + for batch_idx, p_attn_mask in enumerate(patch_attention_mask): + if tgt_sizes is not None: + nb_patches_h = tgt_sizes[batch_idx][0] + nb_patches_w = tgt_sizes[batch_idx][1] + else: + nb_patches_h = p_attn_mask[:, 0].sum() + nb_patches_w = p_attn_mask[0].sum() + + fractional_coords_h = torch.arange(0, 1 - 1e-6, 1 / nb_patches_h) + fractional_coords_w = torch.arange(0, 1 - 1e-6, 1 / nb_patches_w) + + bucket_coords_h = torch.bucketize(fractional_coords_h, boundaries, right=True) + bucket_coords_w = torch.bucketize(fractional_coords_w, boundaries, right=True) + + pos_ids = (bucket_coords_h[:, None] * num_patches_per_side + bucket_coords_w).flatten() + position_ids[batch_idx][p_attn_mask.view(-1).cpu()] = pos_ids + + return position_ids + + core = ov.Core() class OvModelForCausalLMWithEmb(GenerationMixin): - def __init__(self, model_dir, device="CPU", ov_config=None, compile=True) -> None: + def __init__(self, model_dir, device="CPU", ov_config=None, compile=True, slice_lm_head=True) -> None: self._supports_cache_class = False self.config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True) self.config.is_decoder = True @@ -393,6 +598,8 @@ def __init__(self, model_dir, device="CPU", ov_config=None, compile=True) -> Non model_dir = Path(model_dir) self.model = core.read_model(model_dir / "language_model.xml") self.token_emb = core.read_model(model_dir / "embed_tokens.xml") + if slice_lm_head: + self.slice_lm_head() self.request = None self.token_emb_request = None self._device = device.upper() @@ -402,9 +609,16 @@ def __init__(self, model_dir, device="CPU", ov_config=None, compile=True) -> Non self._past_length = None self.input_names = [input_t.get_any_name() for input_t in self.model.inputs] self.main_input_name = "input_ids" + self.llm_times = [] if compile: self.compile() + def slice_lm_head(self): + manager = Manager() + manager.register_pass(InsertSlice()) + manager.run_passes(self.model) + self.model.validate_nodes_and_infer_types() + def compile(self): if self.request is None: self.request = core.compile_model(self.model, self._device, self.ov_config).create_infer_request() @@ -446,6 +660,7 @@ def prepare_inputs( inputs = {} # past_key_values are not used explicitly, instead they are handled inside the model if past_key_values is None: + self.llm_times = [] # This is the first iteration in a sequence, reset all states if self.request is not None: self.request.reset_state() @@ -657,20 +872,39 @@ def get_vllm_embedding(self, data): for i in range(B): patch_attn_mask[i, 0, : tgt_sizes[i][0] * tgt_sizes[i][1]] = True - vision_batch_size = 1 + vision_batch_size = 32 all_pixel_values = all_pixel_values if B > vision_batch_size: hs = [] for i in range(0, B, vision_batch_size): start_idx = i end_idx = i + vision_batch_size - tmp_hs = torch.from_numpy( - self.vpm([all_pixel_values[start_idx:end_idx], patch_attn_mask[start_idx:end_idx], tgt_sizes[start_idx:end_idx]])[0] + block_pxl_values = all_pixel_values[start_idx:end_idx] + block_patch_attn_mask = patch_attn_mask[start_idx:end_idx] + block_tgt_sizes = tgt_sizes[start_idx:end_idx] + block_position_ids = prepare_vis_position_ids( + block_pxl_values, + block_patch_attn_mask, + block_tgt_sizes, + self.config.vision_config.patch_size, + self.config.vision_config.image_size // self.config.patch_size, ) + start = time.perf_counter() + tmp_hs = torch.from_numpy(self.vpm([block_pxl_values, block_patch_attn_mask, block_position_ids])[0]) + self.vpm_times.append(time.perf_counter() - start) hs.append(tmp_hs) vision_embedding = torch.cat(hs, dim=0) else: - vision_embedding = torch.from_numpy(self.vpm([all_pixel_values, patch_attn_mask, tgt_sizes])[0]) + position_ids = prepare_vis_position_ids( + all_pixel_values, + patch_attn_mask, + tgt_sizes, + self.config.vision_config.patch_size, + self.config.vision_config.image_size // self.config.patch_size, + ) + start = time.perf_counter() + vision_embedding = torch.from_numpy(self.vpm([all_pixel_values, patch_attn_mask, position_ids])[0]) + vision_embedding = torch.from_numpy(self.vpm([all_pixel_values, patch_attn_mask, position_ids])[0]) vision_embedding = self.resampler(vision_embedding, tgt_sizes) start = 0 @@ -801,6 +1035,8 @@ def chat( use_image_id=None, **kwargs, ): + self.vpm_times = [] + self.resampler_times = [] if isinstance(msgs[0], list): batched = True else: @@ -844,7 +1080,6 @@ def chat( copy_msgs = deepcopy(msgs) assert len(msgs) > 0, "msgs is empty" - assert sampling or not stream, "if use stream mode, make sure sampling=True" if image is not None and isinstance(copy_msgs[0]["content"], str): copy_msgs[0]["content"] = [image, copy_msgs[0]["content"]] @@ -882,7 +1117,6 @@ def chat( generation_config = {"top_p": 0.8, "top_k": 100, "temperature": 0.7, "do_sample": True, "repetition_penalty": 1.05} else: generation_config = { - "num_beams": 3, "repetition_penalty": 1.2, } @@ -958,8 +1192,8 @@ def main(): gc.collect() convert_vision_encoder(model, model_dir) - ov_cpm = init_model(model_dir, "CPU") - print(ov_cpm.chat(Image.open(requests.get("https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11", stream=True).raw), [{"role": "user", "content": "What is unusual on this image?"}], ov_cpm.processor.tokenizer)) + # ov_cpm = init_model(model_dir, "CPU") + # print(ov_cpm.chat(Image.open(requests.get("https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11", stream=True).raw), [{"role": "user", "content": "What is unusual on this image?"}], ov_cpm.processor.tokenizer)) if "__main__" == __name__: main() diff --git a/samples/cpp/visual_language_chat/load_image.cpp b/samples/cpp/visual_language_chat/load_image.cpp index 85fe7e2fbe..855f7567bf 100644 --- a/samples/cpp/visual_language_chat/load_image.cpp +++ b/samples/cpp/visual_language_chat/load_image.cpp @@ -13,7 +13,7 @@ ov::Tensor utils::load_image(const std::filesystem::path& image_path) { image_path.string().c_str(), &x, &y, &channels_in_file, desired_channels); if (!image) { - throw std::runtime_error{"Failed to load the image"}; + throw std::runtime_error{"Failed to load the image."}; } struct SharedImageAllocator { unsigned char* image; @@ -22,11 +22,11 @@ ov::Tensor utils::load_image(const std::filesystem::path& image_path) { if (channels * height * width == bytes) { return image; } - throw std::runtime_error{"Unexpected number of bytes was requested to allocate"}; + throw std::runtime_error{"Unexpected number of bytes was requested to allocate."}; } void deallocate(void*, size_t bytes, size_t) { if (channels * height * width != bytes) { - throw std::runtime_error{"Unexpected number of bytes was requested to deallocate"}; + throw std::runtime_error{"Unexpected number of bytes was requested to deallocate."}; } std::free(image); image = nullptr; diff --git a/samples/requirements.txt b/samples/requirements.txt index 18145bed85..4821d6dbef 100644 --- a/samples/requirements.txt +++ b/samples/requirements.txt @@ -3,5 +3,4 @@ optimum[openvino]==1.22.0 einops==0.8.0 # For Qwen transformers_stream_generator==0.0.5 # For Qwen diffusers==0.30.3 -pillow torchvision # needed for mini-CPM export script. Need to remove when we switch to exporting with optimum-intel. diff --git a/src/cpp/include/openvino/genai/processor_config.hpp b/src/cpp/include/openvino/genai/processor_config.hpp index 9a70d1f3ae..bef6754e14 100644 --- a/src/cpp/include/openvino/genai/processor_config.hpp +++ b/src/cpp/include/openvino/genai/processor_config.hpp @@ -14,6 +14,7 @@ namespace ov::genai { /// preprocessor_config.json. class OPENVINO_GENAI_EXPORTS ProcessorConfig { public: + size_t image_size = 980; /// @brief Dimensions of the smaller, non-overlapping patches that the /// input image is divided into before being fed into the /// transformer model. Used to divide image height and width. diff --git a/src/cpp/src/clip.hpp b/src/cpp/src/clip.hpp index c8965a4890..99c06a05d2 100644 --- a/src/cpp/src/clip.hpp +++ b/src/cpp/src/clip.hpp @@ -25,6 +25,8 @@ struct clip_ctx { std::vector buf_compute_meta; projector_type proj_type = PROJECTOR_TYPE_RESAMPLER; + size_t patch_size = 0; + size_t image_size = 0; }; // RGB uint8 image diff --git a/src/cpp/src/llm_pipeline.cpp b/src/cpp/src/llm_pipeline.cpp index 4a46b525e7..ff7ceb051e 100644 --- a/src/cpp/src/llm_pipeline.cpp +++ b/src/cpp/src/llm_pipeline.cpp @@ -18,24 +18,6 @@ #include "openvino/genai/lora_adapter.hpp" #include "lora_helper.hpp" -namespace { - -ov::genai::TokenizedInputs subtract_chat_tokenized_inputs(const ov::genai::TokenizedInputs& fisrt, const ov::genai::TokenizedInputs& second){ - auto first_size = fisrt.input_ids.get_size(); - auto second_size = second.input_ids.get_size(); - ov::Shape new_shape{1, first_size - second_size}; - - ov::Tensor new_input_ids(ov::element::i64, new_shape); - auto data_ptr = fisrt.input_ids.data(); - std::copy(data_ptr + second_size, data_ptr + first_size, new_input_ids.data()); - - ov::Tensor new_attention_mask(ov::element::i64, new_shape); - std::fill_n(new_attention_mask.data(), new_shape[1], 1); - - return {new_input_ids, new_attention_mask}; -} -} - namespace ov { namespace genai { @@ -153,7 +135,7 @@ class StatefulLLMPipeline final : public LLMPipelineImplBase { encoded_input = new_chat_tokens; } else { auto prev_chat_tokens = m_tokenizer.encode(m_templated_chat_history, ov::genai::add_special_tokens(add_special_tokens_)); - encoded_input = subtract_chat_tokenized_inputs(new_chat_tokens, prev_chat_tokens); + encoded_input = utils::subtract_chat_tokenized_inputs(new_chat_tokens, prev_chat_tokens); } m_templated_chat_history = new_templated_chat_history; // TODO: Forbid LoRA config change if we are in the chat mode, because it requires regenerating the history with LoRA applied diff --git a/src/cpp/src/utils.hpp b/src/cpp/src/utils.hpp index c149bb308f..fe6e4eed14 100644 --- a/src/cpp/src/utils.hpp +++ b/src/cpp/src/utils.hpp @@ -86,6 +86,20 @@ ProcessorConfig from_any_map( std::pair split_core_complile_config(const ov::AnyMap& plugin_config); +inline ov::genai::TokenizedInputs subtract_chat_tokenized_inputs(const ov::genai::TokenizedInputs& fisrt, const ov::genai::TokenizedInputs& second){ + auto first_size = fisrt.input_ids.get_size(); + auto second_size = second.input_ids.get_size(); + ov::Shape new_shape{1, first_size - second_size}; + + ov::Tensor new_input_ids(ov::element::i64, new_shape); + auto data_ptr = fisrt.input_ids.data(); + std::copy(data_ptr + second_size, data_ptr + first_size, new_input_ids.data()); + + ov::Tensor new_attention_mask(ov::element::i64, new_shape); + std::fill_n(new_attention_mask.data(), new_shape[1], 1); + + return {new_input_ids, new_attention_mask}; +} } // namespace utils } // namespace genai } // namespace ov diff --git a/src/cpp/src/vision_encoder.cpp b/src/cpp/src/vision_encoder.cpp index a35a5d8db7..05539b67dc 100644 --- a/src/cpp/src/vision_encoder.cpp +++ b/src/cpp/src/vision_encoder.cpp @@ -216,6 +216,65 @@ ov::Tensor preprocess_for_encoder(const ov::Tensor& images, size_t kernel) { return permuted_tensor; } +// torch.bucketize(fractional_coords, boundaries, right=True) +std::vector bucket_size_right(const std::vector& fractional_coords, const std::vector& boundaries) { + std::vector bucket_coords(fractional_coords.size()); + std::transform(fractional_coords.begin(), fractional_coords.end(), bucket_coords.begin(), [&boundaries](float fractional_coord) { + return std::distance(boundaries.begin(), std::upper_bound(boundaries.begin(), boundaries.end(), fractional_coord)); + }); + return bucket_coords; +} + +ov::Tensor prepare_vis_position_ids( + const ov::Tensor& pixel_values, + const ov::Tensor& patch_attention_mask, + const std::vector tgt_sizes, + size_t patch_size, + size_t num_patches_per_side +) { + size_t batch_size = pixel_values.get_shape().at(0); + size_t max_im_h = pixel_values.get_shape().at(2), max_im_w = pixel_values.get_shape().at(3); + size_t max_nb_patches_h = max_im_h / patch_size, max_nb_patches_w = max_im_w / patch_size; + std::vector boundaries(1.0f * num_patches_per_side - 1); + std::generate(boundaries.begin(), boundaries.end(), [num_patches_per_side, val = 0.0f]() mutable { + val += 1.0f / num_patches_per_side; + return val; + }); + size_t position_ids_batch_elem = max_nb_patches_h * max_nb_patches_w; + ov::Tensor position_ids{ov::element::i64, {batch_size, position_ids_batch_elem}}; + // throw std::runtime_error(""); + int64_t* res_data = position_ids.data(); + std::fill_n(res_data, position_ids.get_size(), 0); + + for (size_t batch_idx = 0; batch_idx < batch_size; ++batch_idx) { + size_t nb_patches_h = tgt_sizes.at(batch_idx).height; + size_t nb_patches_w = tgt_sizes.at(batch_idx).width; + + std::vector fractional_coords_h(nb_patches_h); + std::generate(fractional_coords_h.begin(), fractional_coords_h.end(), [nb_patches_h, val = -1.0f / nb_patches_h]() mutable { + val += 1.0f / nb_patches_h; + return val; + }); + std::vector fractional_coords_w(nb_patches_w); + std::generate(fractional_coords_w.begin(), fractional_coords_w.end(), [nb_patches_w, val = -1.0f / nb_patches_w]() mutable { + val += 1.0f / nb_patches_w; + return val; + }); + + std::vector bucket_coords_h = bucket_size_right(fractional_coords_h, boundaries); + std::vector bucket_coords_w = bucket_size_right(fractional_coords_w, boundaries); + + std::vector pos_ids(bucket_coords_h.size() * bucket_coords_w.size()); + for (size_t col = 0; col < bucket_coords_h.size(); ++col) { + for (size_t row = 0; row < bucket_coords_w.size(); ++row) {; + pos_ids.at(col * bucket_coords_w.size() + row) = bucket_coords_h.at(col) * num_patches_per_side + bucket_coords_w.at(row); + } + } + std::copy(pos_ids.begin(), pos_ids.end(), res_data + batch_idx * position_ids_batch_elem); + } + return position_ids; +} + EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const ov::Tensor& img, ov::InferRequest& encoder, int max_slice_nums, int scale_resolution, size_t patch_size, bool never_split) { clip_image_u8 source{ int(img.get_shape().at(3)), @@ -244,14 +303,11 @@ EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const o ov::Tensor patch_attention_mask{ov::element::boolean, {pixel_values.get_shape().at(0), 1, resized_source_size.height * resized_source_size.width}}; std::fill_n(patch_attention_mask.data(), patch_attention_mask.get_size(), true); encoder.set_tensor("patch_attention_mask", patch_attention_mask); - ov::Tensor tgt_sizes{ov::element::i64, {1, 2}}; - int64_t* tgt_sizes_data = tgt_sizes.data(); - tgt_sizes_data[0] = resized_source_size.height; - tgt_sizes_data[1] = resized_source_size.width; - encoder.set_tensor("tgt_sizes", tgt_sizes); + ov::Tensor position_ids = prepare_vis_position_ids(pixel_values, patch_attention_mask, {resized_source_size}, ctx_clip.patch_size, ctx_clip.image_size / ctx_clip.patch_size); + encoder.set_tensor("position_ids", position_ids); encoder.infer(); const ov::Tensor& output_tensor = encoder.get_output_tensor(); - ov::Tensor resized_source{output_tensor.get_element_type(), output_tensor.get_shape()}; + ov::Tensor resized_source{ov::element::f32, output_tensor.get_shape()}; output_tensor.copy_to(resized_source); if (1 == preprocessed.size()) { @@ -266,27 +322,24 @@ EncodedImage llava_image_embed_make_with_bytes_slice(clip_ctx& ctx_clip, const o size_t n_patches = size.height / patch_size * size.width / patch_size, old_hidden_size = resized_source.get_shape().at(2); ov::Tensor encoded_slices{ov::element::f32, {preprocessed.size() - 1, preprocessed.at(1).size(), n_patches, old_hidden_size}}; - // там внутри есть какая-то операция которая констант фолдит батч и из-за этого нельзя использовать отличный от того что был при экспорте - // констант фолдит она его в торч скрипте - // Even though batch can't be used, it's still possible to use async. for (size_t row = 1; row < preprocessed.size(); ++row) { for (size_t col = 0; col < preprocessed.at(row).size(); ++col) { clip_image_f32& elem = preprocessed.at(row).at(col); sliced_sizes.push_back({elem.ny / patch_size, elem.nx / patch_size}); - encoder.set_tensor("pixel_values", preprocess_for_encoder( + ov::Tensor pixel_values = preprocess_for_encoder( {ov::element::f32, {1, 3, size_t(elem.ny), size_t(elem.nx)}, elem.buf.data()}, patch_size - )); + ); + encoder.set_tensor("pixel_values", pixel_values); ov::Tensor patch_attention_mask{ov::element::boolean, {1, 1, sliced_sizes.back().height * sliced_sizes.back().width}}; std::fill_n(patch_attention_mask.data(), patch_attention_mask.get_size(), true); encoder.set_tensor("patch_attention_mask", patch_attention_mask); - ov::Tensor tgt_sizes{ov::element::i64, {1, 2}}; - int64_t* tgt_sizes_data = tgt_sizes.data(); - tgt_sizes_data[0] = sliced_sizes.back().height; - tgt_sizes_data[1] = sliced_sizes.back().width; - encoder.set_tensor("tgt_sizes", tgt_sizes); + ov::Tensor position_ids = prepare_vis_position_ids(pixel_values, patch_attention_mask, {sliced_sizes.back()}, ctx_clip.patch_size, ctx_clip.image_size / ctx_clip.patch_size); + encoder.set_tensor("position_ids", position_ids); + const ov::Tensor& old = encoder.get_output_tensor(); encoder.set_output_tensor({ov::element::f32, {1, n_patches, old_hidden_size}, encoded_slices.data() + ((row - 1) * preprocessed.at(row).size() + col) * n_patches * old_hidden_size}); encoder.infer(); + encoder.set_output_tensor(old); } } return {resized_source, resized_source_size, encoded_slices, sliced_sizes}; @@ -305,6 +358,8 @@ VisionEncoder::VisionEncoder(const std::filesystem::path& model_dir, const std:: EncodedImage VisionEncoder::encode(const ov::Tensor& image, const ProcessorConfig& config) { clip_ctx ctx_clip; + ctx_clip.patch_size = m_processor_config.patch_size; + ctx_clip.image_size = m_processor_config.image_size; std::copy(config.norm_mean.begin(), config.norm_mean.end(), ctx_clip.image_mean); std::copy(config.norm_std.begin(), config.norm_std.end(), ctx_clip.image_std); return llava_image_embed_make_with_bytes_slice(ctx_clip, image, m_encoder, config.max_slice_nums, config.scale_resolution, config.patch_size, 0 == config.max_slice_nums); diff --git a/src/cpp/src/vlm_pipeline.cpp b/src/cpp/src/vlm_pipeline.cpp index 5910d54bd8..99c38c976d 100644 --- a/src/cpp/src/vlm_pipeline.cpp +++ b/src/cpp/src/vlm_pipeline.cpp @@ -338,12 +338,11 @@ DecodedResults VLMPipeline::generate( const StreamerVariant& streamer ) { std::string images_prompt; - EncodedImage embeds; - if (!rgbs.empty()) { - OPENVINO_ASSERT(1 == rgbs.size(), "TODO: Only a single image allowed"); - embeds = m_vision_encoder.encode(rgbs.at(0)); + std::vector embeds; + for (const ov::Tensor& rgb : rgbs) { + EncodedImage encoded_image = m_vision_encoder.encode(rgb); if (m_vlm_config.use_image_id) { - images_prompt = m_vlm_config.im_id_start + std::to_string(image_id) + m_vlm_config.im_id_end; + images_prompt += m_vlm_config.im_id_start + std::to_string(image_id) + m_vlm_config.im_id_end; ++image_id; } std::string unk64; @@ -351,8 +350,8 @@ DecodedResults VLMPipeline::generate( unk64 += m_vlm_config.unk; } images_prompt += m_vlm_config.im_start + unk64 + m_vlm_config.im_end; - if (embeds.slices) { - ov::Shape slices_shape = embeds.slices.get_shape(); + if (encoded_image.slices) { + ov::Shape slices_shape = encoded_image.slices.get_shape(); for (size_t row_idx = 0; row_idx < slices_shape.at(0); ++row_idx) { for (size_t col_idx = 0; col_idx < slices_shape.at(1); ++col_idx) { images_prompt += m_vlm_config.slice_start + unk64 + m_vlm_config.slice_end; @@ -365,9 +364,10 @@ DecodedResults VLMPipeline::generate( // Strangely, \n isn't placed between . images_prompt += '\n'; } + embeds.push_back(std::move(encoded_image)); } images_prompt += prompt; - std::string new_templated_chat_history; + ov::Tensor encoded_input; if (m_is_chat_conversation) { // KV cache in model already contains prompts and answers from previous iterations. // So only new prompt wrapped into chat template to be sent into model. Tokenizer always returns @@ -379,8 +379,29 @@ DecodedResults VLMPipeline::generate( // KV cache contains it. So we have to add it manually or get it by tokenization all chat history. m_history.push_back({{"role", "user"}, {"content", images_prompt}}); constexpr bool add_generation_prompt = true; - new_templated_chat_history = m_tokenizer.apply_chat_template(m_history, add_generation_prompt); + std::string new_templated_chat_history = m_tokenizer.apply_chat_template(m_history, add_generation_prompt); + ov::Tensor new_chat_tokens = m_tokenizer.encode(new_templated_chat_history).input_ids; + if (0 == m_language.get_tensor("attention_mask").get_shape().at(1)) { + encoded_input = new_chat_tokens; + } else { + TokenizedInputs prev_chat_tokens = m_tokenizer.encode( + m_templated_chat_history + ); + encoded_input = utils::subtract_chat_tokenized_inputs( + {new_chat_tokens}, prev_chat_tokens + ).input_ids; + } + m_templated_chat_history = std::move(new_templated_chat_history); + } else { + encoded_input = m_tokenizer.encode(images_prompt).input_ids; } + m_embedding.set_input_tensor(encoded_input); + m_embedding.infer(); + ov::Tensor inputs_embeds = m_embedding.get_output_tensor(); + OPENVINO_ASSERT( + m_vlm_config.hidden_size == inputs_embeds.get_shape().at(2), + "Unexpected embedding size" + ); ov::Tensor special_tokens = m_tokenizer.encode( m_vlm_config.im_start + m_vlm_config.im_end @@ -391,59 +412,37 @@ DecodedResults VLMPipeline::generate( 4 == special_tokens.get_shape().at(1), "Every special token must be represented with a single int." ); - size_t im_start_id = special_tokens.data()[0]; - size_t im_end_id = special_tokens.data()[1]; - size_t slice_start_id = special_tokens.data()[2]; - size_t slice_end_id = special_tokens.data()[3]; - ov::Tensor input_ids = m_tokenizer.encode(new_templated_chat_history).input_ids; - m_embedding.set_input_tensor(input_ids); - m_embedding.infer(); - ov::Tensor inputs_embeds = m_embedding.get_output_tensor(); - OPENVINO_ASSERT( - m_vlm_config.hidden_size == inputs_embeds.get_shape().at(2), - "Unexpected embedding size" - ); - if (!rgbs.empty()) { - int64_t* ids = input_ids.data(); - const ov::Tensor& resampled_source = resample(*this, embeds.resized_source, {embeds.resized_source_size}); + int64_t im_start_id = special_tokens.data()[0]; + int64_t im_end_id = special_tokens.data()[1]; + int64_t slice_start_id = special_tokens.data()[2]; + int64_t slice_end_id = special_tokens.data()[3]; + int64_t im_start_pos = 0, slice_start_pos = 0; + int64_t* begin = encoded_input.data(); + int64_t* ids = begin; + size_t encoded_input_size = encoded_input.get_size(); + int64_t* end = ids + encoded_input_size; + float* inputs_embeds_data = inputs_embeds.data(); + for (const EncodedImage& encoded_image : embeds) { + const ov::Tensor& resampled_source = resample(*this, encoded_image.resized_source, {encoded_image.resized_source_size}); float* emb = resampled_source.data(); - bool replacing = false; - for (size_t token_idx = 0; token_idx < inputs_embeds.get_shape().at(1); ++token_idx) { - if (im_start_id == ids[token_idx]) { - replacing = true; - } - if (replacing) { - std::copy_n(emb, resampled_source.get_size(), inputs_embeds.data() + token_idx * m_vlm_config.hidden_size); - token_idx += resampled_source.get_shape().at(1); - replacing = false; - break; - } - } - if (embeds.slices) { + ids = std::find(ids, end, im_start_id); + OPENVINO_ASSERT(end != ids); + std::copy_n(emb, resampled_source.get_size(), inputs_embeds_data + std::distance(begin, ids) * m_vlm_config.hidden_size); + ids += m_vlm_config.query_num; + if (encoded_image.slices) { size_t token_idx = 0; - const ov::Shape& slices_shape = embeds.slices.get_shape(); - const std::vector& sliced_sizes = embeds.slices_sizes; + const ov::Shape& slices_shape = encoded_image.slices.get_shape(); + const std::vector& sliced_sizes = encoded_image.slices_sizes; for (size_t i = 0; i < slices_shape.at(0); ++i) { for (size_t ja = 0; ja < slices_shape.at(1); ++ja) { size_t d2 = slices_shape.at(2); size_t d3 = slices_shape.at(3); - ov::Tensor encoded_view{ov::element::f32, {1, d2, d3}, embeds.slices.data() + (i * slices_shape.at(1) + ja) * d2 * d3}; + ov::Tensor encoded_view{ov::element::f32, {1, d2, d3}, encoded_image.slices.data() + (i * slices_shape.at(1) + ja) * d2 * d3}; const ov::Tensor& vision_embed_tensor_i_j = resample(*this, encoded_view, {sliced_sizes.at(i * slices_shape.at(1) + ja)}); - for (; token_idx < inputs_embeds.get_shape().at(1); ++token_idx) { - if (slice_start_id == ids[token_idx]) { - replacing = true; - } - if (slice_end_id == ids[token_idx]) { - replacing = false; - break; - } - if (replacing) { - std::copy_n(vision_embed_tensor_i_j.data(), vision_embed_tensor_i_j.get_size(), inputs_embeds.data() + token_idx * m_vlm_config.hidden_size); - token_idx += vision_embed_tensor_i_j.get_shape().at(1); - replacing = false; - break; - } - } + ids = std::find(ids, end, slice_start_id); + OPENVINO_ASSERT(end != ids); + std::copy_n(vision_embed_tensor_i_j.data(), vision_embed_tensor_i_j.get_size(), inputs_embeds_data + std::distance(begin, ids) * m_vlm_config.hidden_size); + ids += m_vlm_config.query_num; } } } @@ -519,39 +518,19 @@ DecodedResults VLMPipeline::generate( streamer_ptr->end(); } + std::string decoded_results = m_tokenizer.decode(generated); if (m_is_chat_conversation) { - // auto new_chat_tokens = m_tokenizer.encode(new_templated_chat_history); - // if (m_is_cache_empty) { - // encoded_input = new_chat_tokens; - // } else { - // auto prev_chat_tokens = m_tokenizer.encode(m_templated_chat_history); - // encoded_input = subtract_chat_tokenized_inputs(new_chat_tokens, prev_chat_tokens); - // } - // m_templated_chat_history = new_templated_chat_history; + // Tail of chat template is missing in KV cache. + // Find the tail to concatenate it with the next input prompt. + m_templated_chat_history.append(decoded_results); + m_history.push_back({{"role", "assistant"}, {"content", decoded_results}}); } else { for (auto& variable : m_language.query_state()) { variable.reset(); } m_language.get_tensor("attention_mask").set_shape({1, 0}); - } - DecodedResults results; - results.texts = {m_tokenizer.decode(generated)}; - - // TODO: implement performance metrics - results.perf_metrics = ov::genai::PerfMetrics(); - results.perf_metrics.m_evaluated = false; - results.perf_metrics.generate_duration = {0, 0}; - results.perf_metrics.inference_duration= {0, 0}; - results.perf_metrics.tokenization_duration = {0, 0}; - results.perf_metrics.detokenization_duration= {0, 0}; - results.perf_metrics.ttft = {0, 0}; - results.perf_metrics.tpot= {0, 0}; - results.perf_metrics.ipot= {0, 0}; - results.perf_metrics.throughput= {0, 0}; - results.perf_metrics.num_generated_tokens = generated.size(); - results.perf_metrics.num_input_tokens= 0; - - return results; + } + return {{std::move(decoded_results)}}; } DecodedResults VLMPipeline::generate( @@ -559,13 +538,23 @@ DecodedResults VLMPipeline::generate( const ov::AnyMap& config_map ) { auto image = config_map.find(ov::genai::image.name()); + auto images = config_map.find(ov::genai::images.name()); + OPENVINO_ASSERT( + config_map.end() == image || config_map.end() == images, + "Only one property can be set: image of images." + ); + std::vector rgbs; + if (config_map.end() != image) { + rgbs = {image->second.as()}; + } if (config_map.end() != images) { + rgbs = images->second.as>(); + } ov::genai::OptionalGenerationConfig config_arg = utils::get_config_from_map(config_map); GenerationConfig config = (config_arg.has_value()) ? *config_arg : get_generation_config(); config.update_generation_config(config_map); return generate( prompt, - config_map.end() == image ? std::vector{} - : std::vector{image->second.as()}, + rgbs, config, utils::get_streamer_from_map(config_map) ); diff --git a/src/docs/BUILD.md b/src/docs/BUILD.md index 79d6ce861a..77657620a0 100644 --- a/src/docs/BUILD.md +++ b/src/docs/BUILD.md @@ -43,11 +43,11 @@ OpenVINO GenAI can be built as an extra module during the OpenVINO build process 1. Clone OpenVINO and OpenVINO GenAI repositories: ```sh git clone --recursive https://github.com/openvinotoolkit/openvino.git - git clone --recursive https://github.com/openvinotoolkit/openvino_genai.git + git clone --recursive https://github.com/openvinotoolkit/openvino.genai.git ``` 2. Configure CMake with OpenVINO extra modules: ```sh - cmake -DOPENVINO_EXTRA_MODULES=./openvino_genai -DCPACK_ARCHIVE_COMPONENT_INSTALL=OFF -S ./openvino -B ./build + cmake -DOPENVINO_EXTRA_MODULES=./openvino.genai -DCPACK_ARCHIVE_COMPONENT_INSTALL=OFF -S ./openvino -B ./build ``` 3. Build OpenVINO archive with GenAI: ```sh diff --git a/thirdparty/openvino_tokenizers b/thirdparty/openvino_tokenizers index b6c36a3026..e74460f8b7 160000 --- a/thirdparty/openvino_tokenizers +++ b/thirdparty/openvino_tokenizers @@ -1 +1 @@ -Subproject commit b6c36a302696329f008e4425c9d98c4e00194a24 +Subproject commit e74460f8b78c26ad46ccaccc0ee34d7ccccf56f7 From 6609a088ce860b25a20de32f79629d276952f620 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 9 Oct 2024 20:23:48 +0400 Subject: [PATCH 42/42] Remove py constructor --- src/python/py_vlm_pipeline.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/python/py_vlm_pipeline.cpp b/src/python/py_vlm_pipeline.cpp index 8d6a5f0077..04faed542a 100644 --- a/src/python/py_vlm_pipeline.cpp +++ b/src/python/py_vlm_pipeline.cpp @@ -118,25 +118,6 @@ void init_vlm_pipeline(py::module_& m) { device (str): Device to run the model on (e.g., CPU, GPU). Default is 'CPU'. )") - .def(py::init([]( - const std::string& model_path, - const ov::genai::Tokenizer& tokenizer, - const std::string& device, - const std::map& config - ) { - ScopedVar env_manager(utils::ov_tokenizers_module_path()); - return std::make_unique(model_path, tokenizer, device, utils::properties_to_any_map(config)); - }), - py::arg("model_path"), - py::arg("tokenizer"), - py::arg("device") = "CPU", - py::arg("config") = ov::AnyMap({}), "openvino.properties map" - R"( - VLMPipeline class constructor for manualy created openvino_genai.Tokenizer. - model_path (str): Path to the folder with exported model files. - tokenizer (openvino_genai.Tokenizer): tokenizer object. - device (str): Device to run the model on (e.g., CPU, GPU). Default is 'CPU'. - )") .def("start_chat", &ov::genai::VLMPipeline::start_chat, py::arg("system_message") = "") .def("finish_chat", &ov::genai::VLMPipeline::finish_chat) .def("get_generation_config", &ov::genai::VLMPipeline::get_generation_config)

    Uf=bO5ZCN6Qe`J$6>C~8!WVZbRv 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