From 61b94e47cbcc7aeeefddde9f41ad695c3230ffd1 Mon Sep 17 00:00:00 2001 From: tink2123 Date: Fri, 11 Dec 2020 17:50:01 +0800 Subject: [PATCH 1/9] polish doc --- README_ch.md | 7 +-- README_en.md | 12 ++-- configs/rec/rec_icdar15_train.yml | 97 ++++++++++++++++++++++++++++++ doc/doc_ch/recognition.md | 16 +++-- doc/doc_en/recognition_en.md | 9 +-- doc/joinus.PNG | Bin 16090 -> 418144 bytes ppocr/utils/ic15_dict.txt | 2 +- 7 files changed, 117 insertions(+), 26 deletions(-) create mode 100644 configs/rec/rec_icdar15_train.yml diff --git a/README_ch.md b/README_ch.md index b1f07e29..701d0194 100644 --- a/README_ch.md +++ b/README_ch.md @@ -54,11 +54,10 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 | 模型简介 | 模型名称 |推荐场景 | 检测模型 | 方向分类器 | 识别模型 | | ------------ | --------------- | ----------------|---- | ---------- | -------- | -| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v1.1_xx |移动端&服务器端|[推理模型](link) / [预训练模型](link)|[推理模型](link) / [预训练模型](link) |[推理模型](link) / [预训练模型](link) | -| 中英文通用OCR模型(155.1M) |ch_ppocr_server_v1.1_xx|服务器端 |[推理模型](link) / [预训练模型](link) |[推理模型](link) / [预训练模型](link) |[推理模型](link) / [预训练模型](link) | -| 中英文超轻量压缩OCR模型(3.5M) | ch_ppocr_mobile_slim_v1.1_xx| 移动端 |[推理模型](link) / [slim模型](link) |[推理模型](link) / [slim模型](link)| [推理模型](link) / [slim模型](link)| +| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v2.0_xx |移动端&服务器端|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar)|[推理模型](link) / [预训练模型](link) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar) | +| 中英文通用OCR模型(155.1M) |ch_ppocr_server_v2.0_xx|服务器端 |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_train.tar) |[推理模型](link) / [预训练模型](link) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar) | -更多模型下载(包括多语言),可以参考[PP-OCR v1.1 系列模型下载](./doc/doc_ch/models_list.md) +更多模型下载(包括多语言),可以参考[PP-OCR v2.0 系列模型下载](./doc/doc_ch/models_list.md) ## 文档教程 - [快速安装](./doc/doc_ch/installation.md) diff --git a/README_en.md b/README_en.md index d74c97ae..05247950 100644 --- a/README_en.md +++ b/README_en.md @@ -62,15 +62,11 @@ Mobile DEMO experience (based on EasyEdge and Paddle-Lite, supports iOS and Andr | Model introduction | Model name | Recommended scene | Detection model | Direction classifier | Recognition model | | ------------------------------------------------------------ | ---------------------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](link) / [pre-trained model](link) | [inference model](link) / [pre-trained model](link) | [inference model](link) / [pre-trained model](link) | -| Chinese and English general OCR model (155.1M) | ch_ppocr_server_v1.1_xx | Server | [inference model](link) / [pre-trained model](link) | [inference model](link) / [pre-trained model](link) | [inference model](link) / [pre-trained model](link) | -| Chinese and English ultra-lightweight compressed OCR model (3.5M) | ch_ppocr_mobile_slim_v1.1_xx | Mobile | [inference model](link) / [slim model](link) | [inference model](link) / [slim model](link) | [inference model](link) / [slim model](link) | -| French ultra-lightweight OCR model (4.6M) | french_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](link) / [pre-trained model](link) | - | [inference model](link) / [pre-trained model](link) | -| German ultra-lightweight OCR model (4.6M) | german_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](link) / [pre-trained model](link) | - |[inference model](link) / [pre-trained model](link) | -| Korean ultra-lightweight OCR model (5.9M) | korean_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](link) / [pre-trained model](link) | - |[inference model](link) / [pre-trained model](link)| -| Japan ultra-lightweight OCR model (6.2M) | japan_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](link) / [pre-trained model](link) | - |[inference model](link) / [pre-trained model](link) | +| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v2.0_xx | Mobile & server |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar)|[inference model](link) / [pre-trained model](link) |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar) | +| Chinese and English general OCR model (155.1M) | ch_ppocr_server_v2.0_xx | Server |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_train.tar) |[inference model](link) / [pre-trained model](link) |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar) | -For more model downloads (including multiple languages), please refer to [PP-OCR v1.1 series model downloads](./doc/doc_en/models_list_en.md). + +For more model downloads (including multiple languages), please refer to [PP-OCR v2.0 series model downloads](./doc/doc_en/models_list_en.md). For a new language request, please refer to [Guideline for new language_requests](#language_requests). diff --git a/configs/rec/rec_icdar15_train.yml b/configs/rec/rec_icdar15_train.yml new file mode 100644 index 00000000..7efbd5cf --- /dev/null +++ b/configs/rec/rec_icdar15_train.yml @@ -0,0 +1,97 @@ +Global: + use_gpu: true + epoch_num: 72 + log_smooth_window: 20 + print_batch_step: 10 + save_model_dir: ./output/rec/ic15/ + save_epoch_step: 3 + # evaluation is run every 2000 iterations + eval_batch_step: [0, 2000] + # if pretrained_model is saved in static mode, load_static_weights must set to True + cal_metric_during_train: True + pretrained_model: + checkpoints: + save_inference_dir: + use_visualdl: False + infer_img: doc/imgs_words_en/word_10.png + # for data or label process + character_dict_path: ppocr/utils/ic15_dict.txt + character_type: ch + max_text_length: 25 + infer_mode: False + use_space_char: False + +Optimizer: + name: Adam + beta1: 0.9 + beta2: 0.999 + lr: + learning_rate: 0.0005 + regularizer: + name: 'L2' + factor: 0 + +Architecture: + model_type: rec + algorithm: CRNN + Transform: + Backbone: + name: ResNet + layers: 34 + Neck: + name: SequenceEncoder + encoder_type: rnn + hidden_size: 256 + Head: + name: CTCHead + fc_decay: 0 + +Loss: + name: CTCLoss + +PostProcess: + name: CTCLabelDecode + +Metric: + name: RecMetric + main_indicator: acc + +Train: + dataset: + name: SimpleDataSet + data_dir: ./train_data/ + label_file_list: ["./train_data/train_list.txt"] + transforms: + - DecodeImage: # load image + img_mode: BGR + channel_first: False + - CTCLabelEncode: # Class handling label + - RecResizeImg: + image_shape: [3, 32, 100] + - KeepKeys: + keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order + loader: + shuffle: True + batch_size_per_card: 256 + drop_last: True + num_workers: 8 + +Eval: + dataset: + name: SimpleDataSet + data_dir: ./train_data/ + label_file_list: ["./train_data/train_list.txt"] + transforms: + - DecodeImage: # load image + img_mode: BGR + channel_first: False + - CTCLabelEncode: # Class handling label + - RecResizeImg: + image_shape: [3, 32, 100] + - KeepKeys: + keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order + loader: + shuffle: False + drop_last: False + batch_size_per_card: 256 + num_workers: 4 diff --git a/doc/doc_ch/recognition.md b/doc/doc_ch/recognition.md index 91b1af78..9dda9ded 100644 --- a/doc/doc_ch/recognition.md +++ b/doc/doc_ch/recognition.md @@ -37,8 +37,6 @@ ln -sf /train_data/dataset 若您本地没有数据集,可以在官网下载 [icdar2015](http://rrc.cvc.uab.es/?ch=4&com=downloads) 数据,用于快速验证。也可以参考[DTRB](https://github.com/clovaai/deep-text-recognition-benchmark#download-lmdb-dataset-for-traininig-and-evaluation-from-here),下载 benchmark 所需的lmdb格式数据集。 -如果希望复现SRN的论文指标,需要下载离线[增广数据](https://pan.baidu.com/s/1-HSZ-ZVdqBF2HaBZ5pRAKA),提取码: y3ry。增广数据是由MJSynth和SynthText做旋转和扰动得到的。数据下载完成后请解压到 {your_path}/PaddleOCR/train_data/data_lmdb_release/training/ 路径下。 - * 使用自己数据集 @@ -65,7 +63,7 @@ wget -P ./train_data/ic15_data https://paddleocr.bj.bcebos.com/dataset/rec_gt_t wget -P ./train_data/ic15_data https://paddleocr.bj.bcebos.com/dataset/rec_gt_test.txt ``` -PaddleOCR 也提供了数据格式转换脚本,可以将官网 label 转换支持的数据格式。 数据转换工具在 `train_data/gen_label.py`, 这里以训练集为例: +PaddleOCR 也提供了数据格式转换脚本,可以将官网 label 转换支持的数据格式。 数据转换工具在 `ppocr/utils/gen_label.py`, 这里以训练集为例: ``` # 将官网下载的标签文件转换为 rec_gt_label.txt @@ -116,9 +114,9 @@ n word_dict.txt 每行有一个单字,将字符与数字索引映射在一起,“and” 将被映射成 [2 5 1] -`ppocr/utils/ppocr_keys_v1.txt` 是一个包含6623个字符的中文字典, +`ppocr/utils/ppocr_keys_v1.txt` 是一个包含6623个字符的中文字典 -`ppocr/utils/ic15_dict.txt` 是一个包含36个字符的英文字典, +`ppocr/utils/ic15_dict.txt` 是一个包含36个字符的英文字典 `ppocr/utils/dict/french_dict.txt` 是一个包含118个字符的法文字典 @@ -128,6 +126,8 @@ word_dict.txt 每行有一个单字,将字符与数字索引映射在一起, `ppocr/utils/dict/german_dict.txt` 是一个包含131个字符的法文字典 +`ppocr/utils/dict/en_dict.txt` 是一个包含63个字符的英文字典 + 您可以按需使用。 @@ -155,10 +155,10 @@ PaddleOCR提供了训练脚本、评估脚本和预测脚本,本节将以 CRNN ``` cd PaddleOCR/ # 下载MobileNetV3的预训练模型 -wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/rec_mv3_none_bilstm_ctc.tar +wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_infer.tar # 解压模型参数 cd pretrain_models -tar -xf rec_mv3_none_bilstm_ctc.tar && rm -rf rec_mv3_none_bilstm_ctc.tar +tar -xf rec_mv3_none_bilstm_ctc_v2.0_infer.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_infer.tar ``` 开始训练: @@ -204,9 +204,7 @@ PaddleOCR支持训练和评估交替进行, 可以在 `configs/rec/rec_icdar15_t | rec_mv3_tps_bilstm_attn.yml | RARE | Mobilenet_v3 large 0.5 | tps | BiLSTM | attention | | rec_r34_vd_none_bilstm_ctc.yml | CRNN | Resnet34_vd | None | BiLSTM | ctc | | rec_r34_vd_none_none_ctc.yml | Rosetta | Resnet34_vd | None | None | ctc | -| rec_r34_vd_tps_bilstm_attn.yml | RARE | Resnet34_vd | tps | BiLSTM | attention | | rec_r34_vd_tps_bilstm_ctc.yml | STARNet | Resnet34_vd | tps | BiLSTM | ctc | -| rec_r50fpn_vd_none_srn.yml | SRN | Resnet50_fpn_vd | None | rnn | srn | 训练中文数据,推荐使用[rec_chinese_lite_train_v2.0.yml](../../configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml),如您希望尝试其他算法在中文数据集上的效果,请参考下列说明修改配置文件: diff --git a/doc/doc_en/recognition_en.md b/doc/doc_en/recognition_en.md index f9849321..14c3da73 100644 --- a/doc/doc_en/recognition_en.md +++ b/doc/doc_en/recognition_en.md @@ -114,11 +114,13 @@ In `word_dict.txt`, there is a single word in each line, which maps characters a `ppocr/utils/dict/french_dict.txt` is a French dictionary with 118 characters -`ppocr/utils/dict/japan_dict.txt` is a French dictionary with 4399 characters +`ppocr/utils/dict/japan_dict.txt` is a Japan dictionary with 4399 characters -`ppocr/utils/dict/korean_dict.txt` is a French dictionary with 3636 characters +`ppocr/utils/dict/korean_dict.txt` is a Korean dictionary with 3636 characters -`ppocr/utils/dict/german_dict.txt` is a French dictionary with 131 characters +`ppocr/utils/dict/german_dict.txt` is a German dictionary with 131 characters + +`ppocr/utils/dict/en_dict.txt` is a English dictionary with 63 characters You can use it on demand. @@ -194,7 +196,6 @@ If the evaluation set is large, the test will be time-consuming. It is recommend | rec_mv3_tps_bilstm_attn.yml | RARE | Mobilenet_v3 large 0.5 | tps | BiLSTM | attention | | rec_r34_vd_none_bilstm_ctc.yml | CRNN | Resnet34_vd | None | BiLSTM | ctc | | rec_r34_vd_none_none_ctc.yml | Rosetta | Resnet34_vd | None | None | ctc | -| rec_r34_vd_tps_bilstm_attn.yml | RARE | Resnet34_vd | tps | BiLSTM | attention | | rec_r34_vd_tps_bilstm_ctc.yml | STARNet | Resnet34_vd | tps | BiLSTM | ctc | For training Chinese data, it is recommended to use diff --git a/doc/joinus.PNG b/doc/joinus.PNG index fa11f286d7d2d56d18d94e9034c3be77c974d42f..a6e947489831d90a841c3bb6f21596d5dac7e1ac 100644 GIT binary patch literal 418144 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 z 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χflU-GA@4 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 O6owvS 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�pI_yRjpS~gy)2T01oNaUX`eKKs|RijR@Zsjkp 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 literal 16090 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 Date: Fri, 11 Dec 2020 21:07:43 +0800 Subject: [PATCH 2/9] set use_shared_momery as False when eval (#1394) --- ppocr/data/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ppocr/data/__init__.py b/ppocr/data/__init__.py index 2f95b377..7b0faf12 100644 --- a/ppocr/data/__init__.py +++ b/ppocr/data/__init__.py @@ -67,6 +67,7 @@ def build_dataloader(config, mode, device, logger): drop_last = loader_config['drop_last'] num_workers = loader_config['num_workers'] + use_shared_memory = False if mode == "Train": #Distribute data to multiple cards batch_sampler = DistributedBatchSampler( @@ -74,6 +75,7 @@ def build_dataloader(config, mode, device, logger): batch_size=batch_size, shuffle=False, drop_last=drop_last) + use_shared_memory = True else: #Distribute data to single card batch_sampler = BatchSampler( @@ -87,6 +89,7 @@ def build_dataloader(config, mode, device, logger): batch_sampler=batch_sampler, places=device, num_workers=num_workers, - return_list=True) + return_list=True, + use_shared_memory=use_shared_memory) return data_loader From 3ebb4a166053845ac0e868fca644094844955d88 Mon Sep 17 00:00:00 2001 From: tink2123 Date: Sat, 12 Dec 2020 14:13:27 +0800 Subject: [PATCH 3/9] update doc --- README_ch.md | 4 ++-- README_en.md | 4 ++-- doc/doc_ch/recognition.md | 4 ++-- doc/doc_en/recognition_en.md | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README_ch.md b/README_ch.md index 701d0194..588af59c 100644 --- a/README_ch.md +++ b/README_ch.md @@ -54,8 +54,8 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 | 模型简介 | 模型名称 |推荐场景 | 检测模型 | 方向分类器 | 识别模型 | | ------------ | --------------- | ----------------|---- | ---------- | -------- | -| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v2.0_xx |移动端&服务器端|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar)|[推理模型](link) / [预训练模型](link) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar) | -| 中英文通用OCR模型(155.1M) |ch_ppocr_server_v2.0_xx|服务器端 |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_train.tar) |[推理模型](link) / [预训练模型](link) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar) | +| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v2.0_xx |移动端&服务器端|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar)|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar) | +| 中英文通用OCR模型(143M) |ch_ppocr_server_v2.0_xx|服务器端 |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar) | 更多模型下载(包括多语言),可以参考[PP-OCR v2.0 系列模型下载](./doc/doc_ch/models_list.md) diff --git a/README_en.md b/README_en.md index 05247950..9e839c44 100644 --- a/README_en.md +++ b/README_en.md @@ -62,8 +62,8 @@ Mobile DEMO experience (based on EasyEdge and Paddle-Lite, supports iOS and Andr | Model introduction | Model name | Recommended scene | Detection model | Direction classifier | Recognition model | | ------------------------------------------------------------ | ---------------------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v2.0_xx | Mobile & server |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar)|[inference model](link) / [pre-trained model](link) |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar) | -| Chinese and English general OCR model (155.1M) | ch_ppocr_server_v2.0_xx | Server |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_train.tar) |[inference model](link) / [pre-trained model](link) |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar) | +| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v2.0_xx | Mobile & server |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar)|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar) | +| Chinese and English general OCR model (143M) | ch_ppocr_server_v2.0_xx | Server |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_traingit.tar) |[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar) | For more model downloads (including multiple languages), please refer to [PP-OCR v2.0 series model downloads](./doc/doc_en/models_list_en.md). diff --git a/doc/doc_ch/recognition.md b/doc/doc_ch/recognition.md index 9dda9ded..25da8fce 100644 --- a/doc/doc_ch/recognition.md +++ b/doc/doc_ch/recognition.md @@ -155,10 +155,10 @@ PaddleOCR提供了训练脚本、评估脚本和预测脚本,本节将以 CRNN ``` cd PaddleOCR/ # 下载MobileNetV3的预训练模型 -wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_infer.tar +wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_train.tar # 解压模型参数 cd pretrain_models -tar -xf rec_mv3_none_bilstm_ctc_v2.0_infer.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_infer.tar +tar -xf rec_mv3_none_bilstm_ctc_v2.0_train.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_train.tar ``` 开始训练: diff --git a/doc/doc_en/recognition_en.md b/doc/doc_en/recognition_en.md index 14c3da73..bc06738c 100644 --- a/doc/doc_en/recognition_en.md +++ b/doc/doc_en/recognition_en.md @@ -151,10 +151,10 @@ First download the pretrain model, you can download the trained model to finetun ``` cd PaddleOCR/ # Download the pre-trained model of MobileNetV3 -wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/rec_mv3_none_bilstm_ctc.tar +wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_train.tar # Decompress model parameters cd pretrain_models -tar -xf rec_mv3_none_bilstm_ctc.tar && rm -rf rec_mv3_none_bilstm_ctc.tar +tar -xf rec_mv3_none_bilstm_ctc_v2.0_train.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_train.tar ``` Start training: From edc0fd0ccd93027add6e119467dd3c8ec6b86500 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Sun, 13 Dec 2020 06:18:26 +0000 Subject: [PATCH 4/9] fix predict_det --- ppocr/postprocess/db_postprocess.py | 2 +- tools/infer/predict_det.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) mode change 100644 => 100755 ppocr/postprocess/db_postprocess.py diff --git a/ppocr/postprocess/db_postprocess.py b/ppocr/postprocess/db_postprocess.py old mode 100644 new mode 100755 index 0be2c12a..16c789dc --- a/ppocr/postprocess/db_postprocess.py +++ b/ppocr/postprocess/db_postprocess.py @@ -40,7 +40,7 @@ class DBPostProcess(object): self.max_candidates = max_candidates self.unclip_ratio = unclip_ratio self.min_size = 3 - self.dilation_kernel = None if not use_dilation else [[1, 1], [1, 1]] + self.dilation_kernel = None if not use_dilation else np.array([[1, 1], [1, 1]]) def boxes_from_bitmap(self, pred, _bitmap, dest_width, dest_height): ''' diff --git a/tools/infer/predict_det.py b/tools/infer/predict_det.py index 43db20d2..6f98ded8 100755 --- a/tools/infer/predict_det.py +++ b/tools/infer/predict_det.py @@ -63,6 +63,7 @@ class TextDetector(object): postprocess_params["box_thresh"] = args.det_db_box_thresh postprocess_params["max_candidates"] = 1000 postprocess_params["unclip_ratio"] = args.det_db_unclip_ratio + postprocess_params["use_dilation"] = True else: logger.info("unknown det_algorithm:{}".format(self.det_algorithm)) sys.exit(0) @@ -111,7 +112,7 @@ class TextDetector(object): box = self.clip_det_res(box, img_height, img_width) rect_width = int(np.linalg.norm(box[0] - box[1])) rect_height = int(np.linalg.norm(box[0] - box[3])) - if rect_width <= 10 or rect_height <= 10: + if rect_width <= 3 or rect_height <= 3: continue dt_boxes_new.append(box) dt_boxes = np.array(dt_boxes_new) From e84ea2667f3da91c75e03dde86441ef3c292db3c Mon Sep 17 00:00:00 2001 From: littletomatodonkey <2120160898@bit.edu.cn> Date: Sun, 13 Dec 2020 17:19:52 +0800 Subject: [PATCH 5/9] fix prob (#1404) --- ppocr/data/imaug/rec_img_aug.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ppocr/data/imaug/rec_img_aug.py b/ppocr/data/imaug/rec_img_aug.py index 3ab5a8f3..2ccb2d1d 100644 --- a/ppocr/data/imaug/rec_img_aug.py +++ b/ppocr/data/imaug/rec_img_aug.py @@ -35,12 +35,13 @@ from .text_image_aug import tia_perspective, tia_stretch, tia_distort class RecAug(object): - def __init__(self, use_tia=True, **kwargsz): + def __init__(self, use_tia=True, aug_prob=0.4, **kwargs): self.use_tia = use_tia + self.aug_prob = aug_prob def __call__(self, data): img = data['image'] - img = warp(img, 10, self.use_tia) + img = warp(img, 10, self.use_tia, self.aug_prob) data['image'] = img return data @@ -329,7 +330,7 @@ def get_warpAffine(config): return rz -def warp(img, ang, use_tia=True): +def warp(img, ang, use_tia=True, prob=0.4): """ warp """ @@ -338,8 +339,6 @@ def warp(img, ang, use_tia=True): config.make(w, h, ang) new_img = img - prob = 0.4 - if config.distort: img_height, img_width = img.shape[0:2] if random.random() <= prob and img_height >= 20 and img_width >= 20: From 53b514e39d14dcd3ede701615be7a3bbd032ee58 Mon Sep 17 00:00:00 2001 From: Double_V Date: Sun, 13 Dec 2020 17:21:26 +0800 Subject: [PATCH 6/9] delete lite,slim, iosdemo and android demo of dyrgaph branch for now (#1403) delete lite,slim, iosdemo and android demo of dyrgaph branch for now --- README_ch.md | 9 +- README_en.md | 12 +- deploy/android_demo/.gitignore | 9 - deploy/android_demo/README.md | 19 - deploy/android_demo/app/.gitignore | 1 - deploy/android_demo/app/build.gradle | 94 - deploy/android_demo/app/proguard-rules.pro | 21 - .../demo/ocr/ExampleInstrumentedTest.java | 26 - .../app/src/main/AndroidManifest.xml | 39 - .../app/src/main/assets/images/5.jpg | Bin 63736 -> 0 bytes .../src/main/assets/labels/ppocr_keys_v1.txt | 6623 ----------------- .../app/src/main/cpp/CMakeLists.txt | 117 - deploy/android_demo/app/src/main/cpp/common.h | 48 - .../android_demo/app/src/main/cpp/native.cpp | 115 - deploy/android_demo/app/src/main/cpp/native.h | 138 - .../app/src/main/cpp/ocr_clipper.cpp | 4629 ------------ .../app/src/main/cpp/ocr_clipper.hpp | 547 -- .../app/src/main/cpp/ocr_crnn_process.cpp | 140 - .../app/src/main/cpp/ocr_crnn_process.h | 19 - .../app/src/main/cpp/ocr_db_post_process.cpp | 336 - .../app/src/main/cpp/ocr_db_post_process.h | 17 - .../app/src/main/cpp/ocr_ppredictor.cpp | 186 - .../app/src/main/cpp/ocr_ppredictor.h | 112 - .../app/src/main/cpp/ppredictor.cpp | 70 - .../app/src/main/cpp/ppredictor.h | 74 - .../app/src/main/cpp/predictor_input.cpp | 29 - .../app/src/main/cpp/predictor_input.h | 28 - .../app/src/main/cpp/predictor_output.cpp | 27 - .../app/src/main/cpp/predictor_output.h | 35 - .../app/src/main/cpp/preprocess.cpp | 84 - .../app/src/main/cpp/preprocess.h | 14 - .../demo/ocr/AppCompatPreferenceActivity.java | 128 - .../paddle/lite/demo/ocr/MainActivity.java | 473 -- .../paddle/lite/demo/ocr/MiniActivity.java | 157 - .../lite/demo/ocr/OCRPredictorNative.java | 100 - .../paddle/lite/demo/ocr/OcrResultModel.java | 52 - .../baidu/paddle/lite/demo/ocr/Predictor.java | 355 - .../lite/demo/ocr/SettingsActivity.java | 201 - .../com/baidu/paddle/lite/demo/ocr/Utils.java | 159 - .../drawable-v24/ic_launcher_foreground.xml | 34 - .../res/drawable/ic_launcher_background.xml | 170 - .../app/src/main/res/layout/activity_main.xml | 99 - .../app/src/main/res/layout/activity_mini.xml | 46 - .../src/main/res/menu/menu_action_options.xml | 21 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2963 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4905 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2783 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6895 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6387 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10413 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9128 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15132 -> 0 bytes .../app/src/main/res/values/arrays.xml | 39 - .../app/src/main/res/values/colors.xml | 6 - .../app/src/main/res/values/strings.xml | 26 - .../app/src/main/res/values/styles.xml | 25 - .../app/src/main/res/xml/file_paths.xml | 4 - .../app/src/main/res/xml/settings.xml | 75 - .../paddle/lite/demo/ocr/ExampleUnitTest.java | 17 - deploy/android_demo/build.gradle | 27 - deploy/android_demo/gradle.properties | 15 - .../gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - deploy/android_demo/gradlew | 172 - deploy/android_demo/gradlew.bat | 84 - deploy/android_demo/settings.gradle | 1 - deploy/ios_demo/download_dependencies.sh | 32 - .../ocr_demo.xcodeproj/project.pbxproj | 462 -- deploy/ios_demo/ocr_demo/AppDelegate.h | 17 - deploy/ios_demo/ocr_demo/AppDelegate.m | 51 - .../AppIcon.appiconset/Contents.json | 98 - .../ocr_demo/Assets.xcassets/Contents.json | 6 - .../Base.lproj/LaunchScreen.storyboard | 25 - .../ocr_demo/Base.lproj/Main.storyboard | 111 - deploy/ios_demo/ocr_demo/BoxLayer.h | 20 - deploy/ios_demo/ocr_demo/BoxLayer.m | 80 - deploy/ios_demo/ocr_demo/Helpers.h | 31 - deploy/ios_demo/ocr_demo/Helpers.m | 17 - deploy/ios_demo/ocr_demo/Info.plist | 49 - deploy/ios_demo/ocr_demo/OcrData.h | 15 - deploy/ios_demo/ocr_demo/OcrData.m | 12 - deploy/ios_demo/ocr_demo/ViewController.h | 16 - deploy/ios_demo/ocr_demo/ViewController.mm | 536 -- deploy/ios_demo/ocr_demo/label_list.txt | 6623 ----------------- deploy/ios_demo/ocr_demo/main.m | 16 - deploy/ios_demo/ocr_demo/ocr.png | Bin 62926 -> 0 bytes .../ios_demo/ocr_demo/pdocr/ocr_clipper.cpp | 4629 ------------ .../ios_demo/ocr_demo/pdocr/ocr_clipper.hpp | 547 -- .../ocr_demo/pdocr/ocr_crnn_process.cpp | 141 - .../ocr_demo/pdocr/ocr_crnn_process.h | 19 - .../ocr_demo/pdocr/ocr_db_post_process.cpp | 372 - .../ocr_demo/pdocr/ocr_db_post_process.h | 10 - deploy/ios_demo/ocr_demo/timer.h | 87 - deploy/lite/Makefile | 77 - deploy/lite/config.txt | 4 - deploy/lite/crnn_process.cc | 115 - deploy/lite/crnn_process.h | 38 - deploy/lite/db_post_process.cc | 301 - deploy/lite/db_post_process.h | 62 - deploy/lite/ocr_db_crnn.cc | 368 - deploy/lite/prepare.sh | 9 - deploy/lite/readme.md | 233 - deploy/lite/readme_en.md | 190 - 107 files changed, 15 insertions(+), 31524 deletions(-) delete mode 100644 deploy/android_demo/.gitignore delete mode 100644 deploy/android_demo/README.md delete mode 100644 deploy/android_demo/app/.gitignore delete mode 100644 deploy/android_demo/app/build.gradle delete mode 100644 deploy/android_demo/app/proguard-rules.pro delete mode 100644 deploy/android_demo/app/src/androidTest/java/com/baidu/paddle/lite/demo/ocr/ExampleInstrumentedTest.java delete mode 100644 deploy/android_demo/app/src/main/AndroidManifest.xml delete mode 100644 deploy/android_demo/app/src/main/assets/images/5.jpg delete mode 100644 deploy/android_demo/app/src/main/assets/labels/ppocr_keys_v1.txt delete mode 100644 deploy/android_demo/app/src/main/cpp/CMakeLists.txt delete mode 100644 deploy/android_demo/app/src/main/cpp/common.h delete mode 100644 deploy/android_demo/app/src/main/cpp/native.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/native.h delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_clipper.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_clipper.hpp delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_crnn_process.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_crnn_process.h delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_db_post_process.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_db_post_process.h delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_ppredictor.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h delete mode 100644 deploy/android_demo/app/src/main/cpp/ppredictor.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/ppredictor.h delete mode 100644 deploy/android_demo/app/src/main/cpp/predictor_input.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/predictor_input.h delete mode 100644 deploy/android_demo/app/src/main/cpp/predictor_output.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/predictor_output.h delete mode 100644 deploy/android_demo/app/src/main/cpp/preprocess.cpp delete mode 100644 deploy/android_demo/app/src/main/cpp/preprocess.h delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OcrResultModel.java delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java delete mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Utils.java delete mode 100644 deploy/android_demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 deploy/android_demo/app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 deploy/android_demo/app/src/main/res/layout/activity_main.xml delete mode 100644 deploy/android_demo/app/src/main/res/layout/activity_mini.xml delete mode 100644 deploy/android_demo/app/src/main/res/menu/menu_action_options.xml delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 deploy/android_demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 deploy/android_demo/app/src/main/res/values/arrays.xml delete mode 100644 deploy/android_demo/app/src/main/res/values/colors.xml delete mode 100644 deploy/android_demo/app/src/main/res/values/strings.xml delete mode 100644 deploy/android_demo/app/src/main/res/values/styles.xml delete mode 100644 deploy/android_demo/app/src/main/res/xml/file_paths.xml delete mode 100644 deploy/android_demo/app/src/main/res/xml/settings.xml delete mode 100644 deploy/android_demo/app/src/test/java/com/baidu/paddle/lite/demo/ocr/ExampleUnitTest.java delete mode 100644 deploy/android_demo/build.gradle delete mode 100644 deploy/android_demo/gradle.properties delete mode 100644 deploy/android_demo/gradle/wrapper/gradle-wrapper.jar delete mode 100644 deploy/android_demo/gradle/wrapper/gradle-wrapper.properties delete mode 100644 deploy/android_demo/gradlew delete mode 100644 deploy/android_demo/gradlew.bat delete mode 100644 deploy/android_demo/settings.gradle delete mode 100755 deploy/ios_demo/download_dependencies.sh delete mode 100644 deploy/ios_demo/ocr_demo.xcodeproj/project.pbxproj delete mode 100644 deploy/ios_demo/ocr_demo/AppDelegate.h delete mode 100644 deploy/ios_demo/ocr_demo/AppDelegate.m delete mode 100644 deploy/ios_demo/ocr_demo/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 deploy/ios_demo/ocr_demo/Assets.xcassets/Contents.json delete mode 100644 deploy/ios_demo/ocr_demo/Base.lproj/LaunchScreen.storyboard delete mode 100644 deploy/ios_demo/ocr_demo/Base.lproj/Main.storyboard delete mode 100644 deploy/ios_demo/ocr_demo/BoxLayer.h delete mode 100644 deploy/ios_demo/ocr_demo/BoxLayer.m delete mode 100644 deploy/ios_demo/ocr_demo/Helpers.h delete mode 100644 deploy/ios_demo/ocr_demo/Helpers.m delete mode 100644 deploy/ios_demo/ocr_demo/Info.plist delete mode 100644 deploy/ios_demo/ocr_demo/OcrData.h delete mode 100644 deploy/ios_demo/ocr_demo/OcrData.m delete mode 100644 deploy/ios_demo/ocr_demo/ViewController.h delete mode 100644 deploy/ios_demo/ocr_demo/ViewController.mm delete mode 100644 deploy/ios_demo/ocr_demo/label_list.txt delete mode 100644 deploy/ios_demo/ocr_demo/main.m delete mode 100644 deploy/ios_demo/ocr_demo/ocr.png delete mode 100644 deploy/ios_demo/ocr_demo/pdocr/ocr_clipper.cpp delete mode 100644 deploy/ios_demo/ocr_demo/pdocr/ocr_clipper.hpp delete mode 100644 deploy/ios_demo/ocr_demo/pdocr/ocr_crnn_process.cpp delete mode 100644 deploy/ios_demo/ocr_demo/pdocr/ocr_crnn_process.h delete mode 100644 deploy/ios_demo/ocr_demo/pdocr/ocr_db_post_process.cpp delete mode 100644 deploy/ios_demo/ocr_demo/pdocr/ocr_db_post_process.h delete mode 100644 deploy/ios_demo/ocr_demo/timer.h delete mode 100644 deploy/lite/Makefile delete mode 100644 deploy/lite/config.txt delete mode 100644 deploy/lite/crnn_process.cc delete mode 100644 deploy/lite/crnn_process.h delete mode 100644 deploy/lite/db_post_process.cc delete mode 100644 deploy/lite/db_post_process.h delete mode 100644 deploy/lite/ocr_db_crnn.cc delete mode 100644 deploy/lite/prepare.sh delete mode 100644 deploy/lite/readme.md delete mode 100644 deploy/lite/readme_en.md diff --git a/README_ch.md b/README_ch.md index 588af59c..fa400d31 100644 --- a/README_ch.md +++ b/README_ch.md @@ -77,9 +77,9 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 - [基于Python脚本预测引擎推理](./doc/doc_ch/inference.md) - [基于C++预测引擎推理](./deploy/cpp_infer/readme.md) - [服务化部署](./deploy/hubserving/readme.md) - - [端侧部署](./deploy/lite/readme.md) - - [模型量化](./deploy/slim/quantization/README.md) - - [模型裁剪](./deploy/slim/prune/README.md) + - [端侧部署](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/lite/readme.md) + - [模型量化](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/quantization/README.md) + - [模型裁剪](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/prune/README.md) - [Benchmark](./doc/doc_ch/benchmark.md) - 数据集 - [通用中英文OCR数据集](./doc/doc_ch/datasets.md) @@ -97,6 +97,9 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 - [许可证书](#许可证书) - [贡献代码](#贡献代码) +***注意:动态图端侧部署仍在开发中,目前仅支持动态图训练、python端预测,C++预测, +如果您有需要移动端部署案例或者量化裁剪,请切换到静态图分支;*** + ## PP-OCR Pipline

diff --git a/README_en.md b/README_en.md index 9e839c44..0b5eb1c6 100644 --- a/README_en.md +++ b/README_en.md @@ -88,9 +88,9 @@ For a new language request, please refer to [Guideline for new language_requests - [Python Inference](./doc/doc_en/inference_en.md) - [C++ Inference](./deploy/cpp_infer/readme_en.md) - [Serving](./deploy/hubserving/readme_en.md) - - [Mobile](./deploy/lite/readme_en.md) - - [Model Quantization](./deploy/slim/quantization/README_en.md) - - [Model Compression](./deploy/slim/prune/README_en.md) + - [Mobile](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/lite/readme_en.md) + - [Model Quantization](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/quantization/README_en.md) + - [Model Compression](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/prune/README_en.md) - [Benchmark](./doc/doc_en/benchmark_en.md) - Data Annotation and Synthesis - [Semi-automatic Annotation Tool](./PPOCRLabel/README_en.md) @@ -108,6 +108,12 @@ For a new language request, please refer to [Guideline for new language_requests - [License](#LICENSE) - [Contribution](#CONTRIBUTION) +***Note: The dynamic graphs branch is still under development. +Currently, only dynamic graph training, python-end prediction, and C++ prediction are supported. +If you need mobile-end deployment cases or quantitative demo, +please use the static graph branch.*** + + ## PP-OCR Pipeline diff --git a/deploy/android_demo/.gitignore b/deploy/android_demo/.gitignore deleted file mode 100644 index 93dcb293..00000000 --- a/deploy/android_demo/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/* -.DS_Store -/build -/captures -.externalNativeBuild - diff --git a/deploy/android_demo/README.md b/deploy/android_demo/README.md deleted file mode 100644 index e35e7579..00000000 --- a/deploy/android_demo/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# 如何快速测试 -### 1. 安装最新版本的Android Studio -可以从https://developer.android.com/studio 下载。本Demo使用是4.0版本Android Studio编写。 - -### 2. 按照NDK 20 以上版本 -Demo测试的时候使用的是NDK 20b版本,20版本以上均可以支持编译成功。 - -如果您是初学者,可以用以下方式安装和测试NDK编译环境。 -点击 File -> New ->New Project, 新建 "Native C++" project - -### 3. 导入项目 -点击 File->New->Import Project..., 然后跟着Android Studio的引导导入 - - -# 获得更多支持 -前往[端计算模型生成平台EasyEdge](https://ai.baidu.com/easyedge/app/open_source_demo?referrerUrl=paddlelite),获得更多开发支持: - -- Demo APP:可使用手机扫码安装,方便手机端快速体验文字识别 -- SDK:模型被封装为适配不同芯片硬件和操作系统SDK,包括完善的接口,方便进行二次开发 diff --git a/deploy/android_demo/app/.gitignore b/deploy/android_demo/app/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/deploy/android_demo/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/deploy/android_demo/app/build.gradle b/deploy/android_demo/app/build.gradle deleted file mode 100644 index 5ecb1169..00000000 --- a/deploy/android_demo/app/build.gradle +++ /dev/null @@ -1,94 +0,0 @@ -import java.security.MessageDigest - -apply plugin: 'com.android.application' - -android { - compileSdkVersion 29 - defaultConfig { - applicationId "com.baidu.paddle.lite.demo.ocr" - minSdkVersion 23 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - externalNativeBuild { - cmake { - cppFlags "-std=c++11 -frtti -fexceptions -Wno-format" - arguments '-DANDROID_PLATFORM=android-23', '-DANDROID_STL=c++_shared' ,"-DANDROID_ARM_NEON=TRUE" - } - } - ndk { - // abiFilters "arm64-v8a", "armeabi-v7a" - abiFilters "arm64-v8a", "armeabi-v7a" - ldLibs "jnigraphics" - } - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - externalNativeBuild { - cmake { - path "src/main/cpp/CMakeLists.txt" - version "3.10.2" - } - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} - -def archives = [ - [ - 'src' : 'https://paddlelite-demo.bj.bcebos.com/libs/android/paddle_lite_libs_v2_6_1.tar.gz', - 'dest': 'PaddleLite' - ], - [ - 'src' : 'https://paddlelite-demo.bj.bcebos.com/libs/android/opencv-4.2.0-android-sdk.tar.gz', - 'dest': 'OpenCV' - ], - [ - 'src' : 'https://paddleocr.bj.bcebos.com/deploy/lite/ocr_v1_for_cpu.tar.gz', - 'dest' : 'src/main/assets/models/ocr_v1_for_cpu' - ] -] - -task downloadAndExtractArchives(type: DefaultTask) { - doFirst { - println "Downloading and extracting archives including libs and models" - } - doLast { - // Prepare cache folder for archives - String cachePath = "cache" - if (!file("${cachePath}").exists()) { - mkdir "${cachePath}" - } - archives.eachWithIndex { archive, index -> - MessageDigest messageDigest = MessageDigest.getInstance('MD5') - messageDigest.update(archive.src.bytes) - String cacheName = new BigInteger(1, messageDigest.digest()).toString(32) - // Download the target archive if not exists - boolean copyFiles = !file("${archive.dest}").exists() - if (!file("${cachePath}/${cacheName}.tar.gz").exists()) { - ant.get(src: archive.src, dest: file("${cachePath}/${cacheName}.tar.gz")) - copyFiles = true; // force to copy files from the latest archive files - } - // Extract the target archive if its dest path does not exists - if (copyFiles) { - copy { - from tarTree("${cachePath}/${cacheName}.tar.gz") - into "${archive.dest}" - } - } - } - } -} -preBuild.dependsOn downloadAndExtractArchives \ No newline at end of file diff --git a/deploy/android_demo/app/proguard-rules.pro b/deploy/android_demo/app/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/deploy/android_demo/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/deploy/android_demo/app/src/androidTest/java/com/baidu/paddle/lite/demo/ocr/ExampleInstrumentedTest.java b/deploy/android_demo/app/src/androidTest/java/com/baidu/paddle/lite/demo/ocr/ExampleInstrumentedTest.java deleted file mode 100644 index 77b179da..00000000 --- a/deploy/android_demo/app/src/androidTest/java/com/baidu/paddle/lite/demo/ocr/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.baidu.paddle.lite.demo", appContext.getPackageName()); - } -} diff --git a/deploy/android_demo/app/src/main/AndroidManifest.xml b/deploy/android_demo/app/src/main/AndroidManifest.xml deleted file mode 100644 index 54482b1d..00000000 --- a/deploy/android_demo/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/assets/images/5.jpg b/deploy/android_demo/app/src/main/assets/images/5.jpg deleted file mode 100644 index 8517e125c5e660f1bc603a844f946c68086e4616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63736 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 @{rU7nFH)Mwr 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

*c& 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 diff --git a/deploy/android_demo/app/src/main/assets/labels/ppocr_keys_v1.txt b/deploy/android_demo/app/src/main/assets/labels/ppocr_keys_v1.txt deleted file mode 100644 index 84b885d8..00000000 --- a/deploy/android_demo/app/src/main/assets/labels/ppocr_keys_v1.txt +++ /dev/null @@ -1,6623 +0,0 @@ -' -疗 -绚 -诚 -娇 -溜 -题 -贿 -者 -廖 -更 -纳 -加 -奉 -公 -一 -就 -汴 -计 -与 -路 -房 -原 -妇 -2 -0 -8 -- -7 -其 -> -: -] -, -, -骑 -刈 -全 -消 -昏 -傈 -安 -久 -钟 -嗅 -不 -影 -处 -驽 -蜿 -资 -关 -椤 -地 -瘸 -专 -问 -忖 -票 -嫉 -炎 -韵 -要 -月 -田 -节 -陂 -鄙 -捌 -备 -拳 -伺 -眼 -网 -盎 -大 -傍 -心 -东 -愉 -汇 -蹿 -科 -每 -业 -里 -航 -晏 -字 -平 -录 -先 -1 -3 -彤 -鲶 -产 -稍 -督 -腴 -有 -象 -岳 -注 -绍 -在 -泺 -文 -定 -核 -名 -水 -过 -理 -让 -偷 -率 -等 -这 -发 -” -为 -含 -肥 -酉 -相 -鄱 -七 -编 -猥 -锛 -日 -镀 -蒂 -掰 -倒 -辆 -栾 -栗 -综 -涩 -州 -雌 -滑 -馀 -了 -机 -块 -司 -宰 -甙 -兴 -矽 -抚 -保 -用 -沧 -秩 -如 -收 -息 -滥 -页 -疑 -埠 -! -! -姥 -异 -橹 -钇 -向 -下 -跄 -的 -椴 -沫 -国 -绥 -獠 -报 -开 -民 -蜇 -何 -分 -凇 -长 -讥 -藏 -掏 -施 -羽 -中 -讲 -派 -嘟 -人 -提 -浼 -间 -世 -而 -古 -多 -倪 -唇 -饯 -控 -庚 -首 -赛 -蜓 -味 -断 -制 -觉 -技 -替 -艰 -溢 -潮 -夕 -钺 -外 -摘 -枋 -动 -双 -单 -啮 -户 -枇 -确 -锦 -曜 -杜 -或 -能 -效 -霜 -盒 -然 -侗 -电 -晁 -放 -步 -鹃 -新 -杖 -蜂 -吒 -濂 -瞬 -评 -总 -隍 -对 -独 -合 -也 -是 -府 -青 -天 -诲 -墙 -组 -滴 -级 -邀 -帘 -示 -已 -时 -骸 -仄 -泅 -和 -遨 -店 -雇 -疫 -持 -巍 -踮 -境 -只 -亨 -目 -鉴 -崤 -闲 -体 -泄 -杂 -作 -般 -轰 -化 -解 -迂 -诿 -蛭 -璀 -腾 -告 -版 -服 -省 -师 -小 -规 -程 -线 -海 -办 -引 -二 -桧 -牌 -砺 -洄 -裴 -修 -图 -痫 -胡 -许 -犊 -事 -郛 -基 -柴 -呼 -食 -研 -奶 -律 -蛋 -因 -葆 -察 -戏 -褒 -戒 -再 -李 -骁 -工 -貂 -油 -鹅 -章 -啄 -休 -场 -给 -睡 -纷 -豆 -器 -捎 -说 -敏 -学 -会 -浒 -设 -诊 -格 -廓 -查 -来 -霓 -室 -溆 -¢ -诡 -寥 -焕 -舜 -柒 -狐 -回 -戟 -砾 -厄 -实 -翩 -尿 -五 -入 -径 -惭 -喹 -股 -宇 -篝 -| -; -美 -期 -云 -九 -祺 -扮 -靠 -锝 -槌 -系 -企 -酰 -阊 -暂 -蚕 -忻 -豁 -本 -羹 -执 -条 -钦 -H -獒 -限 -进 -季 -楦 -于 -芘 -玖 -铋 -茯 -未 -答 -粘 -括 -样 -精 -欠 -矢 -甥 -帷 -嵩 -扣 -令 -仔 -风 -皈 -行 -支 -部 -蓉 -刮 -站 -蜡 -救 -钊 -汗 -松 -嫌 -成 -可 -. -鹤 -院 -从 -交 -政 -怕 -活 -调 -球 -局 -验 -髌 -第 -韫 -谗 -串 -到 -圆 -年 -米 -/ -* -友 -忿 -检 -区 -看 -自 -敢 -刃 -个 -兹 -弄 -流 -留 -同 -没 -齿 -星 -聆 -轼 -湖 -什 -三 -建 -蛔 -儿 -椋 -汕 -震 -颧 -鲤 -跟 -力 -情 -璺 -铨 -陪 -务 -指 -族 -训 -滦 -鄣 -濮 -扒 -商 -箱 -十 -召 -慷 -辗 -所 -莞 -管 -护 -臭 -横 -硒 -嗓 -接 -侦 -六 -露 -党 -馋 -驾 -剖 -高 -侬 -妪 -幂 -猗 -绺 -骐 -央 -酐 -孝 -筝 -课 -徇 -缰 -门 -男 -西 -项 -句 -谙 -瞒 -秃 -篇 -教 -碲 -罚 -声 -呐 -景 -前 -富 -嘴 -鳌 -稀 -免 -朋 -啬 -睐 -去 -赈 -鱼 -住 -肩 -愕 -速 -旁 -波 -厅 -健 -茼 -厥 -鲟 -谅 -投 -攸 -炔 -数 -方 -击 -呋 -谈 -绩 -别 -愫 -僚 -躬 -鹧 -胪 -炳 -招 -喇 -膨 -泵 -蹦 -毛 -结 -5 -4 -谱 -识 -陕 -粽 -婚 -拟 -构 -且 -搜 -任 -潘 -比 -郢 -妨 -醪 -陀 -桔 -碘 -扎 -选 -哈 -骷 -楷 -亿 -明 -缆 -脯 -监 -睫 -逻 -婵 -共 -赴 -淝 -凡 -惦 -及 -达 -揖 -谩 -澹 -减 -焰 -蛹 -番 -祁 -柏 -员 -禄 -怡 -峤 -龙 -白 -叽 -生 -闯 -起 -细 -装 -谕 -竟 -聚 -钙 -上 -导 -渊 -按 -艾 -辘 -挡 -耒 -盹 -饪 -臀 -记 -邮 -蕙 -受 -各 -医 -搂 -普 -滇 -朗 -茸 -带 -翻 -酚 -( -光 -堤 -墟 -蔷 -万 -幻 -〓 -瑙 -辈 -昧 -盏 -亘 -蛀 -吉 -铰 -请 -子 -假 -闻 -税 -井 -诩 -哨 -嫂 -好 -面 -琐 -校 -馊 -鬣 -缂 -营 -访 -炖 -占 -农 -缀 -否 -经 -钚 -棵 -趟 -张 -亟 -吏 -茶 -谨 -捻 -论 -迸 -堂 -玉 -信 -吧 -瞠 -乡 -姬 -寺 -咬 -溏 -苄 -皿 -意 -赉 -宝 -尔 -钰 -艺 -特 -唳 -踉 -都 -荣 -倚 -登 -荐 -丧 -奇 -涵 -批 -炭 -近 -符 -傩 -感 -道 -着 -菊 -虹 -仲 -众 -懈 -濯 -颞 -眺 -南 -释 -北 -缝 -标 -既 -茗 -整 -撼 -迤 -贲 -挎 -耱 -拒 -某 -妍 -卫 -哇 -英 -矶 -藩 -治 -他 -元 -领 -膜 -遮 -穗 -蛾 -飞 -荒 -棺 -劫 -么 -市 -火 -温 -拈 -棚 -洼 -转 -果 -奕 -卸 -迪 -伸 -泳 -斗 -邡 -侄 -涨 -屯 -萋 -胭 -氡 -崮 -枞 -惧 -冒 -彩 -斜 -手 -豚 -随 -旭 -淑 -妞 -形 -菌 -吲 -沱 -争 -驯 -歹 -挟 -兆 -柱 -传 -至 -包 -内 -响 -临 -红 -功 -弩 -衡 -寂 -禁 -老 -棍 -耆 -渍 -织 -害 -氵 -渑 -布 -载 -靥 -嗬 -虽 -苹 -咨 -娄 -库 -雉 -榜 -帜 -嘲 -套 -瑚 -亲 -簸 -欧 -边 -6 -腿 -旮 -抛 -吹 -瞳 -得 -镓 -梗 -厨 -继 -漾 -愣 -憨 -士 -策 -窑 -抑 -躯 -襟 -脏 -参 -贸 -言 -干 -绸 -鳄 -穷 -藜 -音 -折 -详 -) -举 -悍 -甸 -癌 -黎 -谴 -死 -罩 -迁 -寒 -驷 -袖 -媒 -蒋 -掘 -模 -纠 -恣 -观 -祖 -蛆 -碍 -位 -稿 -主 -澧 -跌 -筏 -京 -锏 -帝 -贴 -证 -糠 -才 -黄 -鲸 -略 -炯 -饱 -四 -出 -园 -犀 -牧 -容 -汉 -杆 -浈 -汰 -瑷 -造 -虫 -瘩 -怪 -驴 -济 -应 -花 -沣 -谔 -夙 -旅 -价 -矿 -以 -考 -s -u -呦 -晒 -巡 -茅 -准 -肟 -瓴 -詹 -仟 -褂 -译 -桌 -混 -宁 -怦 -郑 -抿 -些 -余 -鄂 -饴 -攒 -珑 -群 -阖 -岔 -琨 -藓 -预 -环 -洮 -岌 -宀 -杲 -瀵 -最 -常 -囡 -周 -踊 -女 -鼓 -袭 -喉 -简 -范 -薯 -遐 -疏 -粱 -黜 -禧 -法 -箔 -斤 -遥 -汝 -奥 -直 -贞 -撑 -置 -绱 -集 -她 -馅 -逗 -钧 -橱 -魉 -[ -恙 -躁 -唤 -9 -旺 -膘 -待 -脾 -惫 -购 -吗 -依 -盲 -度 -瘿 -蠖 -俾 -之 -镗 -拇 -鲵 -厝 -簧 -续 -款 -展 -啃 -表 -剔 -品 -钻 -腭 -损 -清 -锶 -统 -涌 -寸 -滨 -贪 -链 -吠 -冈 -伎 -迥 -咏 -吁 -览 -防 -迅 -失 -汾 -阔 -逵 -绀 -蔑 -列 -川 -凭 -努 -熨 -揪 -利 -俱 -绉 -抢 -鸨 -我 -即 -责 -膦 -易 -毓 -鹊 -刹 -玷 -岿 -空 -嘞 -绊 -排 -术 -估 -锷 -违 -们 -苟 -铜 -播 -肘 -件 -烫 -审 -鲂 -广 -像 -铌 -惰 -铟 -巳 -胍 -鲍 -康 -憧 -色 -恢 -想 -拷 -尤 -疳 -知 -S -Y -F -D -A -峄 -裕 -帮 -握 -搔 -氐 -氘 -难 -墒 -沮 -雨 -叁 -缥 -悴 -藐 -湫 -娟 -苑 -稠 -颛 -簇 -后 -阕 -闭 -蕤 -缚 -怎 -佞 -码 -嘤 -蔡 -痊 -舱 -螯 -帕 -赫 -昵 -升 -烬 -岫 -、 -疵 -蜻 -髁 -蕨 -隶 -烛 -械 -丑 -盂 -梁 -强 -鲛 -由 -拘 -揉 -劭 -龟 -撤 -钩 -呕 -孛 -费 -妻 -漂 -求 -阑 -崖 -秤 -甘 -通 -深 -补 -赃 -坎 -床 -啪 -承 -吼 -量 -暇 -钼 -烨 -阂 -擎 -脱 -逮 -称 -P -神 -属 -矗 -华 -届 -狍 -葑 -汹 -育 -患 -窒 -蛰 -佼 -静 -槎 -运 -鳗 -庆 -逝 -曼 -疱 -克 -代 -官 -此 -麸 -耧 -蚌 -晟 -例 -础 -榛 -副 -测 -唰 -缢 -迹 -灬 -霁 -身 -岁 -赭 -扛 -又 -菡 -乜 -雾 -板 -读 -陷 -徉 -贯 -郁 -虑 -变 -钓 -菜 -圾 -现 -琢 -式 -乐 -维 -渔 -浜 -左 -吾 -脑 -钡 -警 -T -啵 -拴 -偌 -漱 -湿 -硕 -止 -骼 -魄 -积 -燥 -联 -踢 -玛 -则 -窿 -见 -振 -畿 -送 -班 -钽 -您 -赵 -刨 -印 -讨 -踝 -籍 -谡 -舌 -崧 -汽 -蔽 -沪 -酥 -绒 -怖 -财 -帖 -肱 -私 -莎 -勋 -羔 -霸 -励 -哼 -帐 -将 -帅 -渠 -纪 -婴 -娩 -岭 -厘 -滕 -吻 -伤 -坝 -冠 -戊 -隆 -瘁 -介 -涧 -物 -黍 -并 -姗 -奢 -蹑 -掣 -垸 -锴 -命 -箍 -捉 -病 -辖 -琰 -眭 -迩 -艘 -绌 -繁 -寅 -若 -毋 -思 -诉 -类 -诈 -燮 -轲 -酮 -狂 -重 -反 -职 -筱 -县 -委 -磕 -绣 -奖 -晋 -濉 -志 -徽 -肠 -呈 -獐 -坻 -口 -片 -碰 -几 -村 -柿 -劳 -料 -获 -亩 -惕 -晕 -厌 -号 -罢 -池 -正 -鏖 -煨 -家 -棕 -复 -尝 -懋 -蜥 -锅 -岛 -扰 -队 -坠 -瘾 -钬 -@ -卧 -疣 -镇 -譬 -冰 -彷 -频 -黯 -据 -垄 -采 -八 -缪 -瘫 -型 -熹 -砰 -楠 -襁 -箐 -但 -嘶 -绳 -啤 -拍 -盥 -穆 -傲 -洗 -盯 -塘 -怔 -筛 -丿 -台 -恒 -喂 -葛 -永 -¥ -烟 -酒 -桦 -书 -砂 -蚝 -缉 -态 -瀚 -袄 -圳 -轻 -蛛 -超 -榧 -遛 -姒 -奘 -铮 -右 -荽 -望 -偻 -卡 -丶 -氰 -附 -做 -革 -索 -戚 -坨 -桷 -唁 -垅 -榻 -岐 -偎 -坛 -莨 -山 -殊 -微 -骇 -陈 -爨 -推 -嗝 -驹 -澡 -藁 -呤 -卤 -嘻 -糅 -逛 -侵 -郓 -酌 -德 -摇 -※ -鬃 -被 -慨 -殡 -羸 -昌 -泡 -戛 -鞋 -河 -宪 -沿 -玲 -鲨 -翅 -哽 -源 -铅 -语 -照 -邯 -址 -荃 -佬 -顺 -鸳 -町 -霭 -睾 -瓢 -夸 -椁 -晓 -酿 -痈 -咔 -侏 -券 -噎 -湍 -签 -嚷 -离 -午 -尚 -社 -锤 -背 -孟 -使 -浪 -缦 -潍 -鞅 -军 -姹 -驶 -笑 -鳟 -鲁 -》 -孽 -钜 -绿 -洱 -礴 -焯 -椰 -颖 -囔 -乌 -孔 -巴 -互 -性 -椽 -哞 -聘 -昨 -早 -暮 -胶 -炀 -隧 -低 -彗 -昝 -铁 -呓 -氽 -藉 -喔 -癖 -瑗 -姨 -权 -胱 -韦 -堑 -蜜 -酋 -楝 -砝 -毁 -靓 -歙 -锲 -究 -屋 -喳 -骨 -辨 -碑 -武 -鸠 -宫 -辜 -烊 -适 -坡 -殃 -培 -佩 -供 -走 -蜈 -迟 -翼 -况 -姣 -凛 -浔 -吃 -飘 -债 -犟 -金 -促 -苛 -崇 -坂 -莳 -畔 -绂 -兵 -蠕 -斋 -根 -砍 -亢 -欢 -恬 -崔 -剁 -餐 -榫 -快 -扶 -‖ -濒 -缠 -鳜 -当 -彭 -驭 -浦 -篮 -昀 -锆 -秸 -钳 -弋 -娣 -瞑 -夷 -龛 -苫 -拱 -致 -% -嵊 -障 -隐 -弑 -初 -娓 -抉 -汩 -累 -蓖 -" -唬 -助 -苓 -昙 -押 -毙 -破 -城 -郧 -逢 -嚏 -獭 -瞻 -溱 -婿 -赊 -跨 -恼 -璧 -萃 -姻 -貉 -灵 -炉 -密 -氛 -陶 -砸 -谬 -衔 -点 -琛 -沛 -枳 -层 -岱 -诺 -脍 -榈 -埂 -征 -冷 -裁 -打 -蹴 -素 -瘘 -逞 -蛐 -聊 -激 -腱 -萘 -踵 -飒 -蓟 -吆 -取 -咙 -簋 -涓 -矩 -曝 -挺 -揣 -座 -你 -史 -舵 -焱 -尘 -苏 -笈 -脚 -溉 -榨 -诵 -樊 -邓 -焊 -义 -庶 -儋 -蟋 -蒲 -赦 -呷 -杞 -诠 -豪 -还 -试 -颓 -茉 -太 -除 -紫 -逃 -痴 -草 -充 -鳕 -珉 -祗 -墨 -渭 -烩 -蘸 -慕 -璇 -镶 -穴 -嵘 -恶 -骂 -险 -绋 -幕 -碉 -肺 -戳 -刘 -潞 -秣 -纾 -潜 -銮 -洛 -须 -罘 -销 -瘪 -汞 -兮 -屉 -r -林 -厕 -质 -探 -划 -狸 -殚 -善 -煊 -烹 -〒 -锈 -逯 -宸 -辍 -泱 -柚 -袍 -远 -蹋 -嶙 -绝 -峥 -娥 -缍 -雀 -徵 -认 -镱 -谷 -= -贩 -勉 -撩 -鄯 -斐 -洋 -非 -祚 -泾 -诒 -饿 -撬 -威 -晷 -搭 -芍 -锥 -笺 -蓦 -候 -琊 -档 -礁 -沼 -卵 -荠 -忑 -朝 -凹 -瑞 -头 -仪 -弧 -孵 -畏 -铆 -突 -衲 -车 -浩 -气 -茂 -悖 -厢 -枕 -酝 -戴 -湾 -邹 -飚 -攘 -锂 -写 -宵 -翁 -岷 -无 -喜 -丈 -挑 -嗟 -绛 -殉 -议 -槽 -具 -醇 -淞 -笃 -郴 -阅 -饼 -底 -壕 -砚 -弈 -询 -缕 -庹 -翟 -零 -筷 -暨 -舟 -闺 -甯 -撞 -麂 -茌 -蔼 -很 -珲 -捕 -棠 -角 -阉 -媛 -娲 -诽 -剿 -尉 -爵 -睬 -韩 -诰 -匣 -危 -糍 -镯 -立 -浏 -阳 -少 -盆 -舔 -擘 -匪 -申 -尬 -铣 -旯 -抖 -赘 -瓯 -居 -ˇ -哮 -游 -锭 -茏 -歌 -坏 -甚 -秒 -舞 -沙 -仗 -劲 -潺 -阿 -燧 -郭 -嗖 -霏 -忠 -材 -奂 -耐 -跺 -砀 -输 -岖 -媳 -氟 -极 -摆 -灿 -今 -扔 -腻 -枝 -奎 -药 -熄 -吨 -话 -q -额 -慑 -嘌 -协 -喀 -壳 -埭 -视 -著 -於 -愧 -陲 -翌 -峁 -颅 -佛 -腹 -聋 -侯 -咎 -叟 -秀 -颇 -存 -较 -罪 -哄 -岗 -扫 -栏 -钾 -羌 -己 -璨 -枭 -霉 -煌 -涸 -衿 -键 -镝 -益 -岢 -奏 -连 -夯 -睿 -冥 -均 -糖 -狞 -蹊 -稻 -爸 -刿 -胥 -煜 -丽 -肿 -璃 -掸 -跚 -灾 -垂 -樾 -濑 -乎 -莲 -窄 -犹 -撮 -战 -馄 -软 -络 -显 -鸢 -胸 -宾 -妲 -恕 -埔 -蝌 -份 -遇 -巧 -瞟 -粒 -恰 -剥 -桡 -博 -讯 -凯 -堇 -阶 -滤 -卖 -斌 -骚 -彬 -兑 -磺 -樱 -舷 -两 -娱 -福 -仃 -差 -找 -桁 -÷ -净 -把 -阴 -污 -戬 -雷 -碓 -蕲 -楚 -罡 -焖 -抽 -妫 -咒 -仑 -闱 -尽 -邑 -菁 -爱 -贷 -沥 -鞑 -牡 -嗉 -崴 -骤 -塌 -嗦 -订 -拮 -滓 -捡 -锻 -次 -坪 -杩 -臃 -箬 -融 -珂 -鹗 -宗 -枚 -降 -鸬 -妯 -阄 -堰 -盐 -毅 -必 -杨 -崃 -俺 -甬 -状 -莘 -货 -耸 -菱 -腼 -铸 -唏 -痤 -孚 -澳 -懒 -溅 -翘 -疙 -杷 -淼 -缙 -骰 -喊 -悉 -砻 -坷 -艇 -赁 -界 -谤 -纣 -宴 -晃 -茹 -归 -饭 -梢 -铡 -街 -抄 -肼 -鬟 -苯 -颂 -撷 -戈 -炒 -咆 -茭 -瘙 -负 -仰 -客 -琉 -铢 -封 -卑 -珥 -椿 -镧 -窨 -鬲 -寿 -御 -袤 -铃 -萎 -砖 -餮 -脒 -裳 -肪 -孕 -嫣 -馗 -嵇 -恳 -氯 -江 -石 -褶 -冢 -祸 -阻 -狈 -羞 -银 -靳 -透 -咳 -叼 -敷 -芷 -啥 -它 -瓤 -兰 -痘 -懊 -逑 -肌 -往 -捺 -坊 -甩 -呻 -〃 -沦 -忘 -膻 -祟 -菅 -剧 -崆 -智 -坯 -臧 -霍 -墅 -攻 -眯 -倘 -拢 -骠 -铐 -庭 -岙 -瓠 -′ -缺 -泥 -迢 -捶 -? -? -郏 -喙 -掷 -沌 -纯 -秘 -种 -听 -绘 -固 -螨 -团 -香 -盗 -妒 -埚 -蓝 -拖 -旱 -荞 -铀 -血 -遏 -汲 -辰 -叩 -拽 -幅 -硬 -惶 -桀 -漠 -措 -泼 -唑 -齐 -肾 -念 -酱 -虚 -屁 -耶 -旗 -砦 -闵 -婉 -馆 -拭 -绅 -韧 -忏 -窝 -醋 -葺 -顾 -辞 -倜 -堆 -辋 -逆 -玟 -贱 -疾 -董 -惘 -倌 -锕 -淘 -嘀 -莽 -俭 -笏 -绑 -鲷 -杈 -择 -蟀 -粥 -嗯 -驰 -逾 -案 -谪 -褓 -胫 -哩 -昕 -颚 -鲢 -绠 -躺 -鹄 -崂 -儒 -俨 -丝 -尕 -泌 -啊 -萸 -彰 -幺 -吟 -骄 -苣 -弦 -脊 -瑰 -〈 -诛 -镁 -析 -闪 -剪 -侧 -哟 -框 -螃 -守 -嬗 -燕 -狭 -铈 -缮 -概 -迳 -痧 -鲲 -俯 -售 -笼 -痣 -扉 -挖 -满 -咋 -援 -邱 -扇 -歪 -便 -玑 -绦 -峡 -蛇 -叨 -〖 -泽 -胃 -斓 -喋 -怂 -坟 -猪 -该 -蚬 -炕 -弥 -赞 -棣 -晔 -娠 -挲 -狡 -创 -疖 -铕 -镭 -稷 -挫 -弭 -啾 -翔 -粉 -履 -苘 -哦 -楼 -秕 -铂 -土 -锣 -瘟 -挣 -栉 -习 -享 -桢 -袅 -磨 -桂 -谦 -延 -坚 -蔚 -噗 -署 -谟 -猬 -钎 -恐 -嬉 -雒 -倦 -衅 -亏 -璩 -睹 -刻 -殿 -王 -算 -雕 -麻 -丘 -柯 -骆 -丸 -塍 -谚 -添 -鲈 -垓 -桎 -蚯 -芥 -予 -飕 -镦 -谌 -窗 -醚 -菀 -亮 -搪 -莺 -蒿 -羁 -足 -J -真 -轶 -悬 -衷 -靛 -翊 -掩 -哒 -炅 -掐 -冼 -妮 -l -谐 -稚 -荆 -擒 -犯 -陵 -虏 -浓 -崽 -刍 -陌 -傻 -孜 -千 -靖 -演 -矜 -钕 -煽 -杰 -酗 -渗 -伞 -栋 -俗 -泫 -戍 -罕 -沾 -疽 -灏 -煦 -芬 -磴 -叱 -阱 -榉 -湃 -蜀 -叉 -醒 -彪 -租 -郡 -篷 -屎 -良 -垢 -隗 -弱 -陨 -峪 -砷 -掴 -颁 -胎 -雯 -绵 -贬 -沐 -撵 -隘 -篙 -暖 -曹 -陡 -栓 -填 -臼 -彦 -瓶 -琪 -潼 -哪 -鸡 -摩 -啦 -俟 -锋 -域 -耻 -蔫 -疯 -纹 -撇 -毒 -绶 -痛 -酯 -忍 -爪 -赳 -歆 -嘹 -辕 -烈 -册 -朴 -钱 -吮 -毯 -癜 -娃 -谀 -邵 -厮 -炽 -璞 -邃 -丐 -追 -词 -瓒 -忆 -轧 -芫 -谯 -喷 -弟 -半 -冕 -裙 -掖 -墉 -绮 -寝 -苔 -势 -顷 -褥 -切 -衮 -君 -佳 -嫒 -蚩 -霞 -佚 -洙 -逊 -镖 -暹 -唛 -& -殒 -顶 -碗 -獗 -轭 -铺 -蛊 -废 -恹 -汨 -崩 -珍 -那 -杵 -曲 -纺 -夏 -薰 -傀 -闳 -淬 -姘 -舀 -拧 -卷 -楂 -恍 -讪 -厩 -寮 -篪 -赓 -乘 -灭 -盅 -鞣 -沟 -慎 -挂 -饺 -鼾 -杳 -树 -缨 -丛 -絮 -娌 -臻 -嗳 -篡 -侩 -述 -衰 -矛 -圈 -蚜 -匕 -筹 -匿 -濞 -晨 -叶 -骋 -郝 -挚 -蚴 -滞 -增 -侍 -描 -瓣 -吖 -嫦 -蟒 -匾 -圣 -赌 -毡 -癞 -恺 -百 -曳 -需 -篓 -肮 -庖 -帏 -卿 -驿 -遗 -蹬 -鬓 -骡 -歉 -芎 -胳 -屐 -禽 -烦 -晌 -寄 -媾 -狄 -翡 -苒 -船 -廉 -终 -痞 -殇 -々 -畦 -饶 -改 -拆 -悻 -萄 -£ -瓿 -乃 -訾 -桅 -匮 -溧 -拥 -纱 -铍 -骗 -蕃 -龋 -缬 -父 -佐 -疚 -栎 -醍 -掳 -蓄 -x -惆 -颜 -鲆 -榆 -〔 -猎 -敌 -暴 -谥 -鲫 -贾 -罗 -玻 -缄 -扦 -芪 -癣 -落 -徒 -臾 -恿 -猩 -托 -邴 -肄 -牵 -春 -陛 -耀 -刊 -拓 -蓓 -邳 -堕 -寇 -枉 -淌 -啡 -湄 -兽 -酷 -萼 -碚 -濠 -萤 -夹 -旬 -戮 -梭 -琥 -椭 -昔 -勺 -蜊 -绐 -晚 -孺 -僵 -宣 -摄 -冽 -旨 -萌 -忙 -蚤 -眉 -噼 -蟑 -付 -契 -瓜 -悼 -颡 -壁 -曾 -窕 -颢 -澎 -仿 -俑 -浑 -嵌 -浣 -乍 -碌 -褪 -乱 -蔟 -隙 -玩 -剐 -葫 -箫 -纲 -围 -伐 -决 -伙 -漩 -瑟 -刑 -肓 -镳 -缓 -蹭 -氨 -皓 -典 -畲 -坍 -铑 -檐 -塑 -洞 -倬 -储 -胴 -淳 -戾 -吐 -灼 -惺 -妙 -毕 -珐 -缈 -虱 -盖 -羰 -鸿 -磅 -谓 -髅 -娴 -苴 -唷 -蚣 -霹 -抨 -贤 -唠 -犬 -誓 -逍 -庠 -逼 -麓 -籼 -釉 -呜 -碧 -秧 -氩 -摔 -霄 -穸 -纨 -辟 -妈 -映 -完 -牛 -缴 -嗷 -炊 -恩 -荔 -茆 -掉 -紊 -慌 -莓 -羟 -阙 -萁 -磐 -另 -蕹 -辱 -鳐 -湮 -吡 -吩 -唐 -睦 -垠 -舒 -圜 -冗 -瞿 -溺 -芾 -囱 -匠 -僳 -汐 -菩 -饬 -漓 -黑 -霰 -浸 -濡 -窥 -毂 -蒡 -兢 -驻 -鹉 -芮 -诙 -迫 -雳 -厂 -忐 -臆 -猴 -鸣 -蚪 -栈 -箕 -羡 -渐 -莆 -捍 -眈 -哓 -趴 -蹼 -埕 -嚣 -骛 -宏 -淄 -斑 -噜 -严 -瑛 -垃 -椎 -诱 -压 -庾 -绞 -焘 -廿 -抡 -迄 -棘 -夫 -纬 -锹 -眨 -瞌 -侠 -脐 -竞 -瀑 -孳 -骧 -遁 -姜 -颦 -荪 -滚 -萦 -伪 -逸 -粳 -爬 -锁 -矣 -役 -趣 -洒 -颔 -诏 -逐 -奸 -甭 -惠 -攀 -蹄 -泛 -尼 -拼 -阮 -鹰 -亚 -颈 -惑 -勒 -〉 -际 -肛 -爷 -刚 -钨 -丰 -养 -冶 -鲽 -辉 -蔻 -画 -覆 -皴 -妊 -麦 -返 -醉 -皂 -擀 -〗 -酶 -凑 -粹 -悟 -诀 -硖 -港 -卜 -z -杀 -涕 -± -舍 -铠 -抵 -弛 -段 -敝 -镐 -奠 -拂 -轴 -跛 -袱 -e -t -沉 -菇 -俎 -薪 -峦 -秭 -蟹 -历 -盟 -菠 -寡 -液 -肢 -喻 -染 -裱 -悱 -抱 -氙 -赤 -捅 -猛 -跑 -氮 -谣 -仁 -尺 -辊 -窍 -烙 -衍 -架 -擦 -倏 -璐 -瑁 -币 -楞 -胖 -夔 -趸 -邛 -惴 -饕 -虔 -蝎 -§ -哉 -贝 -宽 -辫 -炮 -扩 -饲 -籽 -魏 -菟 -锰 -伍 -猝 -末 -琳 -哚 -蛎 -邂 -呀 -姿 -鄞 -却 -歧 -仙 -恸 -椐 -森 -牒 -寤 -袒 -婆 -虢 -雅 -钉 -朵 -贼 -欲 -苞 -寰 -故 -龚 -坭 -嘘 -咫 -礼 -硷 -兀 -睢 -汶 -’ -铲 -烧 -绕 -诃 -浃 -钿 -哺 -柜 -讼 -颊 -璁 -腔 -洽 -咐 -脲 -簌 -筠 -镣 -玮 -鞠 -谁 -兼 -姆 -挥 -梯 -蝴 -谘 -漕 -刷 -躏 -宦 -弼 -b -垌 -劈 -麟 -莉 -揭 -笙 -渎 -仕 -嗤 -仓 -配 -怏 -抬 -错 -泯 -镊 -孰 -猿 -邪 -仍 -秋 -鼬 -壹 -歇 -吵 -炼 -< -尧 -射 -柬 -廷 -胧 -霾 -凳 -隋 -肚 -浮 -梦 -祥 -株 -堵 -退 -L -鹫 -跎 -凶 -毽 -荟 -炫 -栩 -玳 -甜 -沂 -鹿 -顽 -伯 -爹 -赔 -蛴 -徐 -匡 -欣 -狰 -缸 -雹 -蟆 -疤 -默 -沤 -啜 -痂 -衣 -禅 -w -i -h -辽 -葳 -黝 -钗 -停 -沽 -棒 -馨 -颌 -肉 -吴 -硫 -悯 -劾 -娈 -马 -啧 -吊 -悌 -镑 -峭 -帆 -瀣 -涉 -咸 -疸 -滋 -泣 -翦 -拙 -癸 -钥 -蜒 -+ -尾 -庄 -凝 -泉 -婢 -渴 -谊 -乞 -陆 -锉 -糊 -鸦 -淮 -I -B -N -晦 -弗 -乔 -庥 -葡 -尻 -席 -橡 -傣 -渣 -拿 -惩 -麋 -斛 -缃 -矮 -蛏 -岘 -鸽 -姐 -膏 -催 -奔 -镒 -喱 -蠡 -摧 -钯 -胤 -柠 -拐 -璋 -鸥 -卢 -荡 -倾 -^ -_ -珀 -逄 -萧 -塾 -掇 -贮 -笆 -聂 -圃 -冲 -嵬 -M -滔 -笕 -值 -炙 -偶 -蜱 -搐 -梆 -汪 -蔬 -腑 -鸯 -蹇 -敞 -绯 -仨 -祯 -谆 -梧 -糗 -鑫 -啸 -豺 -囹 -猾 -巢 -柄 -瀛 -筑 -踌 -沭 -暗 -苁 -鱿 -蹉 -脂 -蘖 -牢 -热 -木 -吸 -溃 -宠 -序 -泞 -偿 -拜 -檩 -厚 -朐 -毗 -螳 -吞 -媚 -朽 -担 -蝗 -橘 -畴 -祈 -糟 -盱 -隼 -郜 -惜 -珠 -裨 -铵 -焙 -琚 -唯 -咚 -噪 -骊 -丫 -滢 -勤 -棉 -呸 -咣 -淀 -隔 -蕾 -窈 -饨 -挨 -煅 -短 -匙 -粕 -镜 -赣 -撕 -墩 -酬 -馁 -豌 -颐 -抗 -酣 -氓 -佑 -搁 -哭 -递 -耷 -涡 -桃 -贻 -碣 -截 -瘦 -昭 -镌 -蔓 -氚 -甲 -猕 -蕴 -蓬 -散 -拾 -纛 -狼 -猷 -铎 -埋 -旖 -矾 -讳 -囊 -糜 -迈 -粟 -蚂 -紧 -鲳 -瘢 -栽 -稼 -羊 -锄 -斟 -睁 -桥 -瓮 -蹙 -祉 -醺 -鼻 -昱 -剃 -跳 -篱 -跷 -蒜 -翎 -宅 -晖 -嗑 -壑 -峻 -癫 -屏 -狠 -陋 -袜 -途 -憎 -祀 -莹 -滟 -佶 -溥 -臣 -约 -盛 -峰 -磁 -慵 -婪 -拦 -莅 -朕 -鹦 -粲 -裤 -哎 -疡 -嫖 -琵 -窟 -堪 -谛 -嘉 -儡 -鳝 -斩 -郾 -驸 -酊 -妄 -胜 -贺 -徙 -傅 -噌 -钢 -栅 -庇 -恋 -匝 -巯 -邈 -尸 -锚 -粗 -佟 -蛟 -薹 -纵 -蚊 -郅 -绢 -锐 -苗 -俞 -篆 -淆 -膀 -鲜 -煎 -诶 -秽 -寻 -涮 -刺 -怀 -噶 -巨 -褰 -魅 -灶 -灌 -桉 -藕 -谜 -舸 -薄 -搀 -恽 -借 -牯 -痉 -渥 -愿 -亓 -耘 -杠 -柩 -锔 -蚶 -钣 -珈 -喘 -蹒 -幽 -赐 -稗 -晤 -莱 -泔 -扯 -肯 -菪 -裆 -腩 -豉 -疆 -骜 -腐 -倭 -珏 -唔 -粮 -亡 -润 -慰 -伽 -橄 -玄 -誉 -醐 -胆 -龊 -粼 -塬 -陇 -彼 -削 -嗣 -绾 -芽 -妗 -垭 -瘴 -爽 -薏 -寨 -龈 -泠 -弹 -赢 -漪 -猫 -嘧 -涂 -恤 -圭 -茧 -烽 -屑 -痕 -巾 -赖 -荸 -凰 -腮 -畈 -亵 -蹲 -偃 -苇 -澜 -艮 -换 -骺 -烘 -苕 -梓 -颉 -肇 -哗 -悄 -氤 -涠 -葬 -屠 -鹭 -植 -竺 -佯 -诣 -鲇 -瘀 -鲅 -邦 -移 -滁 -冯 -耕 -癔 -戌 -茬 -沁 -巩 -悠 -湘 -洪 -痹 -锟 -循 -谋 -腕 -鳃 -钠 -捞 -焉 -迎 -碱 -伫 -急 -榷 -奈 -邝 -卯 -辄 -皲 -卟 -醛 -畹 -忧 -稳 -雄 -昼 -缩 -阈 -睑 -扌 -耗 -曦 -涅 -捏 -瞧 -邕 -淖 -漉 -铝 -耦 -禹 -湛 -喽 -莼 -琅 -诸 -苎 -纂 -硅 -始 -嗨 -傥 -燃 -臂 -赅 -嘈 -呆 -贵 -屹 -壮 -肋 -亍 -蚀 -卅 -豹 -腆 -邬 -迭 -浊 -} -童 -螂 -捐 -圩 -勐 -触 -寞 -汊 -壤 -荫 -膺 -渌 -芳 -懿 -遴 -螈 -泰 -蓼 -蛤 -茜 -舅 -枫 -朔 -膝 -眙 -避 -梅 -判 -鹜 -璜 -牍 -缅 -垫 -藻 -黔 -侥 -惚 -懂 -踩 -腰 -腈 -札 -丞 -唾 -慈 -顿 -摹 -荻 -琬 -~ -斧 -沈 -滂 -胁 -胀 -幄 -莜 -Z -匀 -鄄 -掌 -绰 -茎 -焚 -赋 -萱 -谑 -汁 -铒 -瞎 -夺 -蜗 -野 -娆 -冀 -弯 -篁 -懵 -灞 -隽 -芡 -脘 -俐 -辩 -芯 -掺 -喏 -膈 -蝈 -觐 -悚 -踹 -蔗 -熠 -鼠 -呵 -抓 -橼 -峨 -畜 -缔 -禾 -崭 -弃 -熊 -摒 -凸 -拗 -穹 -蒙 -抒 -祛 -劝 -闫 -扳 -阵 -醌 -踪 -喵 -侣 -搬 -仅 -荧 -赎 -蝾 -琦 -买 -婧 -瞄 -寓 -皎 -冻 -赝 -箩 -莫 -瞰 -郊 -笫 -姝 -筒 -枪 -遣 -煸 -袋 -舆 -痱 -涛 -母 -〇 -启 -践 -耙 -绲 -盘 -遂 -昊 -搞 -槿 -诬 -纰 -泓 -惨 -檬 -亻 -越 -C -o -憩 -熵 -祷 -钒 -暧 -塔 -阗 -胰 -咄 -娶 -魔 -琶 -钞 -邻 -扬 -杉 -殴 -咽 -弓 -〆 -髻 -】 -吭 -揽 -霆 -拄 -殖 -脆 -彻 -岩 -芝 -勃 -辣 -剌 -钝 -嘎 -甄 -佘 -皖 -伦 -授 -徕 -憔 -挪 -皇 -庞 -稔 -芜 -踏 -溴 -兖 -卒 -擢 -饥 -鳞 -煲 -‰ -账 -颗 -叻 -斯 -捧 -鳍 -琮 -讹 -蛙 -纽 -谭 -酸 -兔 -莒 -睇 -伟 -觑 -羲 -嗜 -宜 -褐 -旎 -辛 -卦 -诘 -筋 -鎏 -溪 -挛 -熔 -阜 -晰 -鳅 -丢 -奚 -灸 -呱 -献 -陉 -黛 -鸪 -甾 -萨 -疮 -拯 -洲 -疹 -辑 -叙 -恻 -谒 -允 -柔 -烂 -氏 -逅 -漆 -拎 -惋 -扈 -湟 -纭 -啕 -掬 -擞 -哥 -忽 -涤 -鸵 -靡 -郗 -瓷 -扁 -廊 -怨 -雏 -钮 -敦 -E -懦 -憋 -汀 -拚 -啉 -腌 -岸 -f -痼 -瞅 -尊 -咀 -眩 -飙 -忌 -仝 -迦 -熬 -毫 -胯 -篑 -茄 -腺 -凄 -舛 -碴 -锵 -诧 -羯 -後 -漏 -汤 -宓 -仞 -蚁 -壶 -谰 -皑 -铄 -棰 -罔 -辅 -晶 -苦 -牟 -闽 -\ -烃 -饮 -聿 -丙 -蛳 -朱 -煤 -涔 -鳖 -犁 -罐 -荼 -砒 -淦 -妤 -黏 -戎 -孑 -婕 -瑾 -戢 -钵 -枣 -捋 -砥 -衩 -狙 -桠 -稣 -阎 -肃 -梏 -诫 -孪 -昶 -婊 -衫 -嗔 -侃 -塞 -蜃 -樵 -峒 -貌 -屿 -欺 -缫 -阐 -栖 -诟 -珞 -荭 -吝 -萍 -嗽 -恂 -啻 -蜴 -磬 -峋 -俸 -豫 -谎 -徊 -镍 -韬 -魇 -晴 -U -囟 -猜 -蛮 -坐 -囿 -伴 -亭 -肝 -佗 -蝠 -妃 -胞 -滩 -榴 -氖 -垩 -苋 -砣 -扪 -馏 -姓 -轩 -厉 -夥 -侈 -禀 -垒 -岑 -赏 -钛 -辐 -痔 -披 -纸 -碳 -“ -坞 -蠓 -挤 -荥 -沅 -悔 -铧 -帼 -蒌 -蝇 -a -p -y -n -g -哀 -浆 -瑶 -凿 -桶 -馈 -皮 -奴 -苜 -佤 -伶 -晗 -铱 -炬 -优 -弊 -氢 -恃 -甫 -攥 -端 -锌 -灰 -稹 -炝 -曙 -邋 -亥 -眶 -碾 -拉 -萝 -绔 -捷 -浍 -腋 -姑 -菖 -凌 -涞 -麽 -锢 -桨 -潢 -绎 -镰 -殆 -锑 -渝 -铬 -困 -绽 -觎 -匈 -糙 -暑 -裹 -鸟 -盔 -肽 -迷 -綦 -『 -亳 -佝 -俘 -钴 -觇 -骥 -仆 -疝 -跪 -婶 -郯 -瀹 -唉 -脖 -踞 -针 -晾 -忒 -扼 -瞩 -叛 -椒 -疟 -嗡 -邗 -肆 -跆 -玫 -忡 -捣 -咧 -唆 -艄 -蘑 -潦 -笛 -阚 -沸 -泻 -掊 -菽 -贫 -斥 -髂 -孢 -镂 -赂 -麝 -鸾 -屡 -衬 -苷 -恪 -叠 -希 -粤 -爻 -喝 -茫 -惬 -郸 -绻 -庸 -撅 -碟 -宄 -妹 -膛 -叮 -饵 -崛 -嗲 -椅 -冤 -搅 -咕 -敛 -尹 -垦 -闷 -蝉 -霎 -勰 -败 -蓑 -泸 -肤 -鹌 -幌 -焦 -浠 -鞍 -刁 -舰 -乙 -竿 -裔 -。 -茵 -函 -伊 -兄 -丨 -娜 -匍 -謇 -莪 -宥 -似 -蝽 -翳 -酪 -翠 -粑 -薇 -祢 -骏 -赠 -叫 -Q -噤 -噻 -竖 -芗 -莠 -潭 -俊 -羿 -耜 -O -郫 -趁 -嗪 -囚 -蹶 -芒 -洁 -笋 -鹑 -敲 -硝 -啶 -堡 -渲 -揩 -』 -携 -宿 -遒 -颍 -扭 -棱 -割 -萜 -蔸 -葵 -琴 -捂 -饰 -衙 -耿 -掠 -募 -岂 -窖 -涟 -蔺 -瘤 -柞 -瞪 -怜 -匹 -距 -楔 -炜 -哆 -秦 -缎 -幼 -茁 -绪 -痨 -恨 -楸 -娅 -瓦 -桩 -雪 -嬴 -伏 -榔 -妥 -铿 -拌 -眠 -雍 -缇 -‘ -卓 -搓 -哌 -觞 -噩 -屈 -哧 -髓 -咦 -巅 -娑 -侑 -淫 -膳 -祝 -勾 -姊 -莴 -胄 -疃 -薛 -蜷 -胛 -巷 -芙 -芋 -熙 -闰 -勿 -窃 -狱 -剩 -钏 -幢 -陟 -铛 -慧 -靴 -耍 -k -浙 -浇 -飨 -惟 -绗 -祜 -澈 -啼 -咪 -磷 -摞 -诅 -郦 -抹 -跃 -壬 -吕 -肖 -琏 -颤 -尴 -剡 -抠 -凋 -赚 -泊 -津 -宕 -殷 -倔 -氲 -漫 -邺 -涎 -怠 -$ -垮 -荬 -遵 -俏 -叹 -噢 -饽 -蜘 -孙 -筵 -疼 -鞭 -羧 -牦 -箭 -潴 -c -眸 -祭 -髯 -啖 -坳 -愁 -芩 -驮 -倡 -巽 -穰 -沃 -胚 -怒 -凤 -槛 -剂 -趵 -嫁 -v -邢 -灯 -鄢 -桐 -睽 -檗 -锯 -槟 -婷 -嵋 -圻 -诗 -蕈 -颠 -遭 -痢 -芸 -怯 -馥 -竭 -锗 -徜 -恭 -遍 -籁 -剑 -嘱 -苡 -龄 -僧 -桑 -潸 -弘 -澶 -楹 -悲 -讫 -愤 -腥 -悸 -谍 -椹 -呢 -桓 -葭 -攫 -阀 -翰 -躲 -敖 -柑 -郎 -笨 -橇 -呃 -魁 -燎 -脓 -葩 -磋 -垛 -玺 -狮 -沓 -砜 -蕊 -锺 -罹 -蕉 -翱 -虐 -闾 -巫 -旦 -茱 -嬷 -枯 -鹏 -贡 -芹 -汛 -矫 -绁 -拣 -禺 -佃 -讣 -舫 -惯 -乳 -趋 -疲 -挽 -岚 -虾 -衾 -蠹 -蹂 -飓 -氦 -铖 -孩 -稞 -瑜 -壅 -掀 -勘 -妓 -畅 -髋 -W -庐 -牲 -蓿 -榕 -练 -垣 -唱 -邸 -菲 -昆 -婺 -穿 -绡 -麒 -蚱 -掂 -愚 -泷 -涪 -漳 -妩 -娉 -榄 -讷 -觅 -旧 -藤 -煮 -呛 -柳 -腓 -叭 -庵 -烷 -阡 -罂 -蜕 -擂 -猖 -咿 -媲 -脉 -【 -沏 -貅 -黠 -熏 -哲 -烁 -坦 -酵 -兜 -× -潇 -撒 -剽 -珩 -圹 -乾 -摸 -樟 -帽 -嗒 -襄 -魂 -轿 -憬 -锡 -〕 -喃 -皆 -咖 -隅 -脸 -残 -泮 -袂 -鹂 -珊 -囤 -捆 -咤 -误 -徨 -闹 -淙 -芊 -淋 -怆 -囗 -拨 -梳 -渤 -R -G -绨 -蚓 -婀 -幡 -狩 -麾 -谢 -唢 -裸 -旌 -伉 -纶 -裂 -驳 -砼 -咛 -澄 -樨 -蹈 -宙 -澍 -倍 -貔 -操 -勇 -蟠 -摈 -砧 -虬 -够 -缁 -悦 -藿 -撸 -艹 -摁 -淹 -豇 -虎 -榭 -ˉ -吱 -d -° -喧 -荀 -踱 -侮 -奋 -偕 -饷 -犍 -惮 -坑 -璎 -徘 -宛 -妆 -袈 -倩 -窦 -昂 -荏 -乖 -K -怅 -撰 -鳙 -牙 -袁 -酞 -X -痿 -琼 -闸 -雁 -趾 -荚 -虻 -涝 -《 -杏 -韭 -偈 -烤 -绫 -鞘 -卉 -症 -遢 -蓥 -诋 -杭 -荨 -匆 -竣 -簪 -辙 -敕 -虞 -丹 -缭 -咩 -黟 -m -淤 -瑕 -咂 -铉 -硼 -茨 -嶂 -痒 -畸 -敬 -涿 -粪 -窘 -熟 -叔 -嫔 -盾 -忱 -裘 -憾 -梵 -赡 -珙 -咯 -娘 -庙 -溯 -胺 -葱 -痪 -摊 -荷 -卞 -乒 -髦 -寐 -铭 -坩 -胗 -枷 -爆 -溟 -嚼 -羚 -砬 -轨 -惊 -挠 -罄 -竽 -菏 -氧 -浅 -楣 -盼 -枢 -炸 -阆 -杯 -谏 -噬 -淇 -渺 -俪 -秆 -墓 -泪 -跻 -砌 -痰 -垡 -渡 -耽 -釜 -讶 -鳎 -煞 -呗 -韶 -舶 -绷 -鹳 -缜 -旷 -铊 -皱 -龌 -檀 -霖 -奄 -槐 -艳 -蝶 -旋 -哝 -赶 -骞 -蚧 -腊 -盈 -丁 -` -蜚 -矸 -蝙 -睨 -嚓 -僻 -鬼 -醴 -夜 -彝 -磊 -笔 -拔 -栀 -糕 -厦 -邰 -纫 -逭 -纤 -眦 -膊 -馍 -躇 -烯 -蘼 -冬 -诤 -暄 -骶 -哑 -瘠 -」 -臊 -丕 -愈 -咱 -螺 -擅 -跋 -搏 -硪 -谄 -笠 -淡 -嘿 -骅 -谧 -鼎 -皋 -姚 -歼 -蠢 -驼 -耳 -胬 -挝 -涯 -狗 -蒽 -孓 -犷 -凉 -芦 -箴 -铤 -孤 -嘛 -坤 -V -茴 -朦 -挞 -尖 -橙 -诞 -搴 -碇 -洵 -浚 -帚 -蜍 -漯 -柘 -嚎 -讽 -芭 -荤 -咻 -祠 -秉 -跖 -埃 -吓 -糯 -眷 -馒 -惹 -娼 -鲑 -嫩 -讴 -轮 -瞥 -靶 -褚 -乏 -缤 -宋 -帧 -删 -驱 -碎 -扑 -俩 -俄 -偏 -涣 -竹 -噱 -皙 -佰 -渚 -唧 -斡 -# -镉 -刀 -崎 -筐 -佣 -夭 -贰 -肴 -峙 -哔 -艿 -匐 -牺 -镛 -缘 -仡 -嫡 -劣 -枸 -堀 -梨 -簿 -鸭 -蒸 -亦 -稽 -浴 -{ -衢 -束 -槲 -j -阁 -揍 -疥 -棋 -潋 -聪 -窜 -乓 -睛 -插 -冉 -阪 -苍 -搽 -「 -蟾 -螟 -幸 -仇 -樽 -撂 -慢 -跤 -幔 -俚 -淅 -覃 -觊 -溶 -妖 -帛 -侨 -曰 -妾 -泗 -· -: -瀘 -風 -Ë -( -) -∶ -紅 -紗 -瑭 -雲 -頭 -鶏 -財 -許 -• -¥ -樂 -焗 -麗 -— -; -滙 -東 -榮 -繪 -興 -… -門 -業 -π -楊 -國 -顧 -é -盤 -寳 -Λ -龍 -鳳 -島 -誌 -緣 -結 -銭 -萬 -勝 -祎 -璟 -優 -歡 -臨 -時 -購 -= -★ -藍 -昇 -鐵 -觀 -勅 -農 -聲 -畫 -兿 -術 -發 -劉 -記 -專 -耑 -園 -書 -壴 -種 -Ο -● -褀 -號 -銀 -匯 -敟 -锘 -葉 -橪 -廣 -進 -蒄 -鑽 -阝 -祙 -貢 -鍋 -豊 -夬 -喆 -團 -閣 -開 -燁 -賓 -館 -酡 -沔 -順 -+ -硚 -劵 -饸 -陽 -車 -湓 -復 -萊 -氣 -軒 -華 -堃 -迮 -纟 -戶 -馬 -學 -裡 -電 -嶽 -獨 -マ -シ -サ -ジ -燘 -袪 -環 -❤ -臺 -灣 -専 -賣 -孖 -聖 -攝 -線 -▪ -α -傢 -俬 -夢 -達 -莊 -喬 -貝 -薩 -劍 -羅 -壓 -棛 -饦 -尃 -璈 -囍 -醫 -G -I -A -# -N -鷄 -髙 -嬰 -啓 -約 -隹 -潔 -賴 -藝 -~ -寶 -籣 -麺 -  -嶺 -√ -義 -網 -峩 -長 -∧ -魚 -機 -構 -② -鳯 -偉 -L -B -㙟 -畵 -鴿 -' -詩 -溝 -嚞 -屌 -藔 -佧 -玥 -蘭 -織 -1 -3 -9 -0 -7 -點 -砭 -鴨 -鋪 -銘 -廳 -弍 -‧ -創 -湯 -坶 -℃ -卩 -骝 -& -烜 -荘 -當 -潤 -扞 -係 -懷 -碶 -钅 -蚨 -讠 -☆ -叢 -爲 -埗 -涫 -塗 -→ -楽 -現 -鯨 -愛 -瑪 -鈺 -忄 -悶 -藥 -飾 -樓 -視 -孬 -ㆍ -燚 -苪 -師 -① -丼 -锽 -│ -韓 -標 -è -兒 -閏 -匋 -張 -漢 -Ü -髪 -會 -閑 -檔 -習 -裝 -の -峯 -菘 -輝 -И -雞 -釣 -億 -浐 -K -O -R -8 -H -E -P -T -W -D -S -C -M -F -姌 -饹 -» -晞 -廰 -ä -嵯 -鷹 -負 -飲 -絲 -冚 -楗 -澤 -綫 -區 -❋ -← -質 -靑 -揚 -③ -滬 -統 -産 -協 -﹑ -乸 -畐 -經 -運 -際 -洺 -岽 -為 -粵 -諾 -崋 -豐 -碁 -ɔ -V -2 -6 -齋 -誠 -訂 -´ -勑 -雙 -陳 -無 -í -泩 -媄 -夌 -刂 -i -c -t -o -r -a -嘢 -耄 -燴 -暃 -壽 -媽 -靈 -抻 -體 -唻 -É -冮 -甹 -鎮 -錦 -ʌ -蜛 -蠄 -尓 -駕 -戀 -飬 -逹 -倫 -貴 -極 -Я -Й -寬 -磚 -嶪 -郎 -職 -| -間 -n -d -剎 -伈 -課 -飛 -橋 -瘊 -№ -譜 -骓 -圗 -滘 -縣 -粿 -咅 -養 -濤 -彳 -® -% -Ⅱ -啰 -㴪 -見 -矞 -薬 -糁 -邨 -鲮 -顔 -罱 -З -選 -話 -贏 -氪 -俵 -競 -瑩 -繡 -枱 -β -綉 -á -獅 -爾 -™ -麵 -戋 -淩 -徳 -個 -劇 -場 -務 -簡 -寵 -h -實 -膠 -轱 -圖 -築 -嘣 -樹 -㸃 -營 -耵 -孫 -饃 -鄺 -飯 -麯 -遠 -輸 -坫 -孃 -乚 -閃 -鏢 -㎡ -題 -廠 -關 -↑ -爺 -將 -軍 -連 -篦 -覌 -參 -箸 -- -窠 -棽 -寕 -夀 -爰 -歐 -呙 -閥 -頡 -熱 -雎 -垟 -裟 -凬 -勁 -帑 -馕 -夆 -疌 -枼 -馮 -貨 -蒤 -樸 -彧 -旸 -靜 -龢 -暢 -㐱 -鳥 -珺 -鏡 -灡 -爭 -堷 -廚 -Ó -騰 -診 -┅ -蘇 -褔 -凱 -頂 -豕 -亞 -帥 -嘬 -⊥ -仺 -桖 -複 -饣 -絡 -穂 -顏 -棟 -納 -▏ -濟 -親 -設 -計 -攵 -埌 -烺 -ò -頤 -燦 -蓮 -撻 -節 -講 -濱 -濃 -娽 -洳 -朿 -燈 -鈴 -護 -膚 -铔 -過 -補 -Z -U -5 -4 -坋 -闿 -䖝 -餘 -缐 -铞 -貿 -铪 -桼 -趙 -鍊 -[ -㐂 -垚 -菓 -揸 -捲 -鐘 -滏 -𣇉 -爍 -輪 -燜 -鴻 -鮮 -動 -鹞 -鷗 -丄 -慶 -鉌 -翥 -飮 -腸 -⇋ -漁 -覺 -來 -熘 -昴 -翏 -鲱 -圧 -鄉 -萭 -頔 -爐 -嫚 -г -貭 -類 -聯 -幛 -輕 -訓 -鑒 -夋 -锨 -芃 -珣 -䝉 -扙 -嵐 -銷 -處 -ㄱ -語 -誘 -苝 -歸 -儀 -燒 -楿 -內 -粢 -葒 -奧 -麥 -礻 -滿 -蠔 -穵 -瞭 -態 -鱬 -榞 -硂 -鄭 -黃 -煙 -祐 -奓 -逺 -* -瑄 -獲 -聞 -薦 -讀 -這 -樣 -決 -問 -啟 -們 -執 -説 -轉 -單 -隨 -唘 -帶 -倉 -庫 -還 -贈 -尙 -皺 -■ -餅 -產 -○ -∈ -報 -狀 -楓 -賠 -琯 -嗮 -禮 -` -傳 -> -≤ -嗞 -Φ -≥ -換 -咭 -∣ -↓ -曬 -ε -応 -寫 -″ -終 -様 -純 -費 -療 -聨 -凍 -壐 -郵 -ü -黒 -∫ -製 -塊 -調 -軽 -確 -撃 -級 -馴 -Ⅲ -涇 -繹 -數 -碼 -證 -狒 -処 -劑 -< -晧 -賀 -衆 -] -櫥 -兩 -陰 -絶 -對 -鯉 -憶 -◎ -p -e -Y -蕒 -煖 -頓 -測 -試 -鼽 -僑 -碩 -妝 -帯 -≈ -鐡 -舖 -權 -喫 -倆 -ˋ -該 -悅 -ā -俫 -. -f -s -b -m -k -g -u -j -貼 -淨 -濕 -針 -適 -備 -l -/ -給 -謢 -強 -觸 -衛 -與 -⊙ -$ -緯 -變 -⑴ -⑵ -⑶ -㎏ -殺 -∩ -幚 -─ -價 -▲ -離 -ú -ó -飄 -烏 -関 -閟 -﹝ -﹞ -邏 -輯 -鍵 -驗 -訣 -導 -歷 -屆 -層 -▼ -儱 -錄 -熳 -ē -艦 -吋 -錶 -辧 -飼 -顯 -④ -禦 -販 -気 -対 -枰 -閩 -紀 -幹 -瞓 -貊 -淚 -△ -眞 -墊 -Ω -獻 -褲 -縫 -緑 -亜 -鉅 -餠 -{ -} -◆ -蘆 -薈 -█ -◇ -溫 -彈 -晳 -粧 -犸 -穩 -訊 -崬 -凖 -熥 -П -舊 -條 -紋 -圍 -Ⅳ -筆 -尷 -難 -雜 -錯 -綁 -識 -頰 -鎖 -艶 -□ -殁 -殼 -⑧ -├ -▕ -鵬 -ǐ -ō -ǒ -糝 -綱 -▎ -μ -盜 -饅 -醬 -籤 -蓋 -釀 -鹽 -據 -à -ɡ -辦 -◥ -彐 -┌ -婦 -獸 -鲩 -伱 -ī -蒟 -蒻 -齊 -袆 -腦 -寧 -凈 -妳 -煥 -詢 -偽 -謹 -啫 -鯽 -騷 -鱸 -損 -傷 -鎻 -髮 -買 -冏 -儥 -両 -﹢ -∞ -載 -喰 -z -羙 -悵 -燙 -曉 -員 -組 -徹 -艷 -痠 -鋼 -鼙 -縮 -細 -嚒 -爯 -≠ -維 -" -鱻 -壇 -厍 -帰 -浥 -犇 -薡 -軎 -² -應 -醜 -刪 -緻 -鶴 -賜 -噁 -軌 -尨 -镔 -鷺 -槗 -彌 -葚 -濛 -請 -溇 -緹 -賢 -訪 -獴 -瑅 -資 -縤 -陣 -蕟 -栢 -韻 -祼 -恁 -伢 -謝 -劃 -涑 -總 -衖 -踺 -砋 -凉 -籃 -駿 -苼 -瘋 -昽 -紡 -驊 -腎 -﹗ -響 -杋 -剛 -嚴 -禪 -歓 -槍 -傘 -檸 -檫 -炣 -勢 -鏜 -鎢 -銑 -尐 -減 -奪 -惡 -θ -僮 -婭 -臘 -ū -ì -殻 -鉄 -∑ -蛲 -焼 -緖 -續 -紹 -懮 \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/CMakeLists.txt b/deploy/android_demo/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index 742786ad..00000000 --- a/deploy/android_demo/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,117 +0,0 @@ -# For more information about using CMake with Android Studio, read the -# documentation: https://d.android.com/studio/projects/add-native-code.html - -# Sets the minimum version of CMake required to build the native library. - -cmake_minimum_required(VERSION 3.4.1) - -# Creates and names a library, sets it as either STATIC or SHARED, and provides -# the relative paths to its source code. You can define multiple libraries, and -# CMake builds them for you. Gradle automatically packages shared libraries with -# your APK. - -set(PaddleLite_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../PaddleLite") -include_directories(${PaddleLite_DIR}/cxx/include) - -set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../OpenCV/sdk/native/jni") -message(STATUS "opencv dir: ${OpenCV_DIR}") -find_package(OpenCV REQUIRED) -message(STATUS "OpenCV libraries: ${OpenCV_LIBS}") -include_directories(${OpenCV_INCLUDE_DIRS}) -aux_source_directory(. SOURCES) -set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} -ffast-math -Ofast -Os" - ) -set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections -ffunction-sections" - ) -set(CMAKE_SHARED_LINKER_FLAGS - "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -Wl,-z,nocopyreloc") - -add_library( - # Sets the name of the library. - Native - # Sets the library as a shared library. - SHARED - # Provides a relative path to your source file(s). - ${SOURCES}) - -find_library( - # Sets the name of the path variable. - log-lib - # Specifies the name of the NDK library that you want CMake to locate. - log) - -add_library( - # Sets the name of the library. - paddle_light_api_shared - # Sets the library as a shared library. - SHARED - # Provides a relative path to your source file(s). - IMPORTED) - -set_target_properties( - # Specifies the target library. - paddle_light_api_shared - # Specifies the parameter you want to define. - PROPERTIES - IMPORTED_LOCATION - ${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libpaddle_light_api_shared.so - # Provides the path to the library you want to import. -) - - -# Specifies libraries CMake should link to your target library. You can link -# multiple libraries, such as libraries you define in this build script, -# prebuilt third-party libraries, or system libraries. - -target_link_libraries( - # Specifies the target library. - Native - paddle_light_api_shared - ${OpenCV_LIBS} - GLESv2 - EGL - jnigraphics - ${log-lib} -) - -add_custom_command( - TARGET Native - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy - ${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libc++_shared.so - ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libc++_shared.so) - -add_custom_command( - TARGET Native - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy - ${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libpaddle_light_api_shared.so - ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpaddle_light_api_shared.so) - -add_custom_command( - TARGET Native - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy - ${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libhiai.so - ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libhiai.so) - -add_custom_command( - TARGET Native - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy - ${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libhiai_ir.so - ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libhiai_ir.so) - -add_custom_command( - TARGET Native - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy - ${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libhiai_ir_build.so - ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libhiai_ir_build.so) \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/common.h b/deploy/android_demo/app/src/main/cpp/common.h deleted file mode 100644 index f3937e91..00000000 --- a/deploy/android_demo/app/src/main/cpp/common.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// Created by fu on 4/25/18. -// - -#pragma once -#import -#import - -#ifdef __ANDROID__ - -#include - -#define LOG_TAG "OCR_NDK" - -#define LOGI(...) \ - __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) -#define LOGW(...) \ - __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) -#define LOGE(...) \ - __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) -#else -#include -#define LOGI(format, ...) \ - fprintf(stdout, "[" LOG_TAG "]" format "\n", ##__VA_ARGS__) -#define LOGW(format, ...) \ - fprintf(stdout, "[" LOG_TAG "]" format "\n", ##__VA_ARGS__) -#define LOGE(format, ...) \ - fprintf(stderr, "[" LOG_TAG "]Error: " format "\n", ##__VA_ARGS__) -#endif - -enum RETURN_CODE { - RETURN_OK = 0 -}; - -enum NET_TYPE{ - NET_OCR = 900100, - NET_OCR_INTERNAL = 991008 -}; - - -template -inline T product(const std::vector &vec) { - if (vec.empty()){ - return 0; - } - return std::accumulate(vec.begin(), vec.end(), 1, std::multiplies()); -} - diff --git a/deploy/android_demo/app/src/main/cpp/native.cpp b/deploy/android_demo/app/src/main/cpp/native.cpp deleted file mode 100644 index 390c594d..00000000 --- a/deploy/android_demo/app/src/main/cpp/native.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// -// Created by fujiayi on 2020/7/5. -// - -#include "native.h" -#include "ocr_ppredictor.h" -#include -#include -#include - -static paddle::lite_api::PowerMode str_to_cpu_mode(const std::string &cpu_mode); - -extern "C" -JNIEXPORT jlong JNICALL -Java_com_baidu_paddle_lite_demo_ocr_OCRPredictorNative_init(JNIEnv *env, jobject thiz, - jstring j_det_model_path, - jstring j_rec_model_path, - jint j_thread_num, - jstring j_cpu_mode) { - std::string det_model_path = jstring_to_cpp_string(env, j_det_model_path); - std::string rec_model_path = jstring_to_cpp_string(env, j_rec_model_path); - int thread_num = j_thread_num; - std::string cpu_mode = jstring_to_cpp_string(env, j_cpu_mode); - ppredictor::OCR_Config conf; - conf.thread_num = thread_num; - conf.mode = str_to_cpu_mode(cpu_mode); - ppredictor::OCR_PPredictor *orc_predictor = new ppredictor::OCR_PPredictor{conf}; - orc_predictor->init_from_file(det_model_path, rec_model_path); - return reinterpret_cast(orc_predictor); -} - -/** - * "LITE_POWER_HIGH" convert to paddle::lite_api::LITE_POWER_HIGH - * @param cpu_mode - * @return - */ -static paddle::lite_api::PowerMode str_to_cpu_mode(const std::string &cpu_mode) { - static std::map cpu_mode_map{ - {"LITE_POWER_HIGH", paddle::lite_api::LITE_POWER_HIGH}, - {"LITE_POWER_LOW", paddle::lite_api::LITE_POWER_HIGH}, - {"LITE_POWER_FULL", paddle::lite_api::LITE_POWER_FULL}, - {"LITE_POWER_NO_BIND", paddle::lite_api::LITE_POWER_NO_BIND}, - {"LITE_POWER_RAND_HIGH", paddle::lite_api::LITE_POWER_RAND_HIGH}, - {"LITE_POWER_RAND_LOW", paddle::lite_api::LITE_POWER_RAND_LOW} - }; - std::string upper_key; - std::transform(cpu_mode.cbegin(), cpu_mode.cend(), upper_key.begin(), ::toupper); - auto index = cpu_mode_map.find(upper_key); - if (index == cpu_mode_map.end()) { - LOGE("cpu_mode not found %s", upper_key.c_str()); - return paddle::lite_api::LITE_POWER_HIGH; - } else { - return index->second; - } - -} - -extern "C" -JNIEXPORT jfloatArray JNICALL -Java_com_baidu_paddle_lite_demo_ocr_OCRPredictorNative_forward(JNIEnv *env, jobject thiz, - jlong java_pointer, jfloatArray buf, - jfloatArray ddims, - jobject original_image) { - LOGI("begin to run native forward"); - if (java_pointer == 0) { - LOGE("JAVA pointer is NULL"); - return cpp_array_to_jfloatarray(env, nullptr, 0); - } - cv::Mat origin = bitmap_to_cv_mat(env, original_image); - if (origin.size == 0) { - LOGE("origin bitmap cannot convert to CV Mat"); - return cpp_array_to_jfloatarray(env, nullptr, 0); - } - ppredictor::OCR_PPredictor *ppredictor = (ppredictor::OCR_PPredictor *) java_pointer; - std::vector dims_float_arr = jfloatarray_to_float_vector(env, ddims); - std::vector dims_arr; - dims_arr.resize(dims_float_arr.size()); - std::copy(dims_float_arr.cbegin(), dims_float_arr.cend(), dims_arr.begin()); - - // 这里值有点大,就不调用jfloatarray_to_float_vector了 - int64_t buf_len = (int64_t) env->GetArrayLength(buf); - jfloat *buf_data = env->GetFloatArrayElements(buf, JNI_FALSE); - float *data = (jfloat *) buf_data; - std::vector results = ppredictor->infer_ocr(dims_arr, data, - buf_len, - NET_OCR, origin); - LOGI("infer_ocr finished with boxes %ld", results.size()); - // 这里将std::vector 序列化成 float数组,传输到java层再反序列化 - std::vector float_arr; - for (const ppredictor::OCRPredictResult &r :results) { - float_arr.push_back(r.points.size()); - float_arr.push_back(r.word_index.size()); - float_arr.push_back(r.score); - for (const std::vector &point : r.points) { - float_arr.push_back(point.at(0)); - float_arr.push_back(point.at(1)); - } - for (int index: r.word_index) { - float_arr.push_back(index); - } - } - return cpp_array_to_jfloatarray(env, float_arr.data(), float_arr.size()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_com_baidu_paddle_lite_demo_ocr_OCRPredictorNative_release(JNIEnv *env, jobject thiz, - jlong java_pointer){ - if (java_pointer == 0) { - LOGE("JAVA pointer is NULL"); - return; - } - ppredictor::OCR_PPredictor *ppredictor = (ppredictor::OCR_PPredictor *) java_pointer; - delete ppredictor; -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/native.h b/deploy/android_demo/app/src/main/cpp/native.h deleted file mode 100644 index 1ef6d949..00000000 --- a/deploy/android_demo/app/src/main/cpp/native.h +++ /dev/null @@ -1,138 +0,0 @@ -// -// Created by fujiayi on 2020/7/5. -// - -#pragma once - - -#include -#include -#include -#include -#include -#include "common.h" - -inline std::string jstring_to_cpp_string(JNIEnv *env, jstring jstr) { - // In java, a unicode char will be encoded using 2 bytes (utf16). - // so jstring will contain characters utf16. std::string in c++ is - // essentially a string of bytes, not characters, so if we want to - // pass jstring from JNI to c++, we have convert utf16 to bytes. - if (!jstr) { - return ""; - } - const jclass stringClass = env->GetObjectClass(jstr); - const jmethodID getBytes = - env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B"); - const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod( - jstr, getBytes, env->NewStringUTF("UTF-8")); - - size_t length = (size_t) env->GetArrayLength(stringJbytes); - jbyte *pBytes = env->GetByteArrayElements(stringJbytes, NULL); - - std::string ret = std::string(reinterpret_cast(pBytes), length); - env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT); - - env->DeleteLocalRef(stringJbytes); - env->DeleteLocalRef(stringClass); - return ret; -} - -inline jstring cpp_string_to_jstring(JNIEnv *env, std::string str) { - auto *data = str.c_str(); - jclass strClass = env->FindClass("java/lang/String"); - jmethodID strClassInitMethodID = - env->GetMethodID(strClass, "", "([BLjava/lang/String;)V"); - - jbyteArray bytes = env->NewByteArray(strlen(data)); - env->SetByteArrayRegion(bytes, 0, strlen(data), - reinterpret_cast(data)); - - jstring encoding = env->NewStringUTF("UTF-8"); - jstring res = (jstring) ( - env->NewObject(strClass, strClassInitMethodID, bytes, encoding)); - - env->DeleteLocalRef(strClass); - env->DeleteLocalRef(encoding); - env->DeleteLocalRef(bytes); - - return res; -} - -inline jfloatArray cpp_array_to_jfloatarray(JNIEnv *env, const float *buf, - int64_t len) { - if (len == 0) { - return env->NewFloatArray(0); - } - jfloatArray result = env->NewFloatArray(len); - env->SetFloatArrayRegion(result, 0, len, buf); - return result; -} - -inline jintArray cpp_array_to_jintarray(JNIEnv *env, const int *buf, - int64_t len) { - jintArray result = env->NewIntArray(len); - env->SetIntArrayRegion(result, 0, len, buf); - return result; -} - -inline jbyteArray cpp_array_to_jbytearray(JNIEnv *env, const int8_t *buf, - int64_t len) { - jbyteArray result = env->NewByteArray(len); - env->SetByteArrayRegion(result, 0, len, buf); - return result; -} - -inline jlongArray int64_vector_to_jlongarray(JNIEnv *env, - const std::vector &vec) { - jlongArray result = env->NewLongArray(vec.size()); - jlong *buf = new jlong[vec.size()]; - for (size_t i = 0; i < vec.size(); ++i) { - buf[i] = (jlong) vec[i]; - } - env->SetLongArrayRegion(result, 0, vec.size(), buf); - delete[] buf; - return result; -} - -inline std::vector jlongarray_to_int64_vector(JNIEnv *env, - jlongArray data) { - int data_size = env->GetArrayLength(data); - jlong *data_ptr = env->GetLongArrayElements(data, nullptr); - std::vector data_vec(data_ptr, data_ptr + data_size); - env->ReleaseLongArrayElements(data, data_ptr, 0); - return data_vec; -} - -inline std::vector jfloatarray_to_float_vector(JNIEnv *env, - jfloatArray data) { - int data_size = env->GetArrayLength(data); - jfloat *data_ptr = env->GetFloatArrayElements(data, nullptr); - std::vector data_vec(data_ptr, data_ptr + data_size); - env->ReleaseFloatArrayElements(data, data_ptr, 0); - return data_vec; -} - -inline cv::Mat bitmap_to_cv_mat(JNIEnv *env, jobject bitmap) { - AndroidBitmapInfo info; - int result = AndroidBitmap_getInfo(env, bitmap, &info); - if (result != ANDROID_BITMAP_RESULT_SUCCESS) { - LOGE("AndroidBitmap_getInfo failed, result: %d", result); - return cv::Mat{}; - } - if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { - LOGE("Bitmap format is not RGBA_8888 !"); - return cv::Mat{}; - } - unsigned char *srcData = NULL; - AndroidBitmap_lockPixels(env, bitmap, (void **) &srcData); - cv::Mat mat = cv::Mat::zeros(info.height, info.width, CV_8UC4); - memcpy(mat.data, srcData, info.height * info.width * 4); - AndroidBitmap_unlockPixels(env, bitmap); - cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGR); - /** - if (!cv::imwrite("/sdcard/1/copy.jpg", mat)){ - LOGE("Write image failed " ); - } - */ - return mat; -} diff --git a/deploy/android_demo/app/src/main/cpp/ocr_clipper.cpp b/deploy/android_demo/app/src/main/cpp/ocr_clipper.cpp deleted file mode 100644 index d5db3472..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_clipper.cpp +++ /dev/null @@ -1,4629 +0,0 @@ -/******************************************************************************* -* * -* Author : Angus Johnson * -* Version : 6.4.2 * -* Date : 27 February 2017 * -* Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2017 * -* * -* License: * -* Use, modification & distribution is subject to Boost Software License Ver 1. * -* http://www.boost.org/LICENSE_1_0.txt * -* * -* Attributions: * -* The code in this library is an extension of Bala Vatti's clipping algorithm: * -* "A generic solution to polygon clipping" * -* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * -* http://portal.acm.org/citation.cfm?id=129906 * -* * -* Computer graphics and geometric modeling: implementation and algorithms * -* By Max K. Agoston * -* Springer; 1 edition (January 4, 2005) * -* http://books.google.com/books?q=vatti+clipping+agoston * -* * -* See also: * -* "Polygon Offsetting by Computing Winding Numbers" * -* Paper no. DETC2005-85513 pp. 565-575 * -* ASME 2005 International Design Engineering Technical Conferences * -* and Computers and Information in Engineering Conference (IDETC/CIE2005) * -* September 24-28, 2005 , Long Beach, California, USA * -* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * -* * -*******************************************************************************/ - -/******************************************************************************* -* * -* This is a translation of the Delphi Clipper library and the naming style * -* used has retained a Delphi flavour. * -* * -*******************************************************************************/ - -#include "ocr_clipper.hpp" -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ClipperLib { - -static double const pi = 3.141592653589793238; -static double const two_pi = pi *2; -static double const def_arc_tolerance = 0.25; - -enum Direction { dRightToLeft, dLeftToRight }; - -static int const Unassigned = -1; //edge not currently 'owning' a solution -static int const Skip = -2; //edge that would otherwise close a path - -#define HORIZONTAL (-1.0E+40) -#define TOLERANCE (1.0e-20) -#define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE)) - -struct TEdge { - IntPoint Bot; - IntPoint Curr; //current (updated for every new scanbeam) - IntPoint Top; - double Dx; - PolyType PolyTyp; - EdgeSide Side; //side only refers to current side of solution poly - int WindDelta; //1 or -1 depending on winding direction - int WindCnt; - int WindCnt2; //winding count of the opposite polytype - int OutIdx; - TEdge *Next; - TEdge *Prev; - TEdge *NextInLML; - TEdge *NextInAEL; - TEdge *PrevInAEL; - TEdge *NextInSEL; - TEdge *PrevInSEL; -}; - -struct IntersectNode { - TEdge *Edge1; - TEdge *Edge2; - IntPoint Pt; -}; - -struct LocalMinimum { - cInt Y; - TEdge *LeftBound; - TEdge *RightBound; -}; - -struct OutPt; - -//OutRec: contains a path in the clipping solution. Edges in the AEL will -//carry a pointer to an OutRec when they are part of the clipping solution. -struct OutRec { - int Idx; - bool IsHole; - bool IsOpen; - OutRec *FirstLeft; //see comments in clipper.pas - PolyNode *PolyNd; - OutPt *Pts; - OutPt *BottomPt; -}; - -struct OutPt { - int Idx; - IntPoint Pt; - OutPt *Next; - OutPt *Prev; -}; - -struct Join { - OutPt *OutPt1; - OutPt *OutPt2; - IntPoint OffPt; -}; - -struct LocMinSorter -{ - inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2) - { - return locMin2.Y < locMin1.Y; - } -}; - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -inline cInt Round(double val) -{ - if ((val < 0)) return static_cast(val - 0.5); - else return static_cast(val + 0.5); -} -//------------------------------------------------------------------------------ - -inline cInt Abs(cInt val) -{ - return val < 0 ? -val : val; -} - -//------------------------------------------------------------------------------ -// PolyTree methods ... -//------------------------------------------------------------------------------ - -void PolyTree::Clear() -{ - for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) - delete AllNodes[i]; - AllNodes.resize(0); - Childs.resize(0); -} -//------------------------------------------------------------------------------ - -PolyNode* PolyTree::GetFirst() const -{ - if (!Childs.empty()) - return Childs[0]; - else - return 0; -} -//------------------------------------------------------------------------------ - -int PolyTree::Total() const -{ - int result = (int)AllNodes.size(); - //with negative offsets, ignore the hidden outer polygon ... - if (result > 0 && Childs[0] != AllNodes[0]) result--; - return result; -} - -//------------------------------------------------------------------------------ -// PolyNode methods ... -//------------------------------------------------------------------------------ - -PolyNode::PolyNode(): Parent(0), Index(0), m_IsOpen(false) -{ -} -//------------------------------------------------------------------------------ - -int PolyNode::ChildCount() const -{ - return (int)Childs.size(); -} -//------------------------------------------------------------------------------ - -void PolyNode::AddChild(PolyNode& child) -{ - unsigned cnt = (unsigned)Childs.size(); - Childs.push_back(&child); - child.Parent = this; - child.Index = cnt; -} -//------------------------------------------------------------------------------ - -PolyNode* PolyNode::GetNext() const -{ - if (!Childs.empty()) - return Childs[0]; - else - return GetNextSiblingUp(); -} -//------------------------------------------------------------------------------ - -PolyNode* PolyNode::GetNextSiblingUp() const -{ - if (!Parent) //protects against PolyTree.GetNextSiblingUp() - return 0; - else if (Index == Parent->Childs.size() - 1) - return Parent->GetNextSiblingUp(); - else - return Parent->Childs[Index + 1]; -} -//------------------------------------------------------------------------------ - -bool PolyNode::IsHole() const -{ - bool result = true; - PolyNode* node = Parent; - while (node) - { - result = !result; - node = node->Parent; - } - return result; -} -//------------------------------------------------------------------------------ - -bool PolyNode::IsOpen() const -{ - return m_IsOpen; -} -//------------------------------------------------------------------------------ - -#ifndef use_int32 - -//------------------------------------------------------------------------------ -// Int128 class (enables safe math on signed 64bit integers) -// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 -// Int128 val2((long64)9223372036854775807); -// Int128 val3 = val1 * val2; -// val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) -//------------------------------------------------------------------------------ - -class Int128 -{ - public: - ulong64 lo; - long64 hi; - - Int128(long64 _lo = 0) - { - lo = (ulong64)_lo; - if (_lo < 0) hi = -1; else hi = 0; - } - - - Int128(const Int128 &val): lo(val.lo), hi(val.hi){} - - Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} - - Int128& operator = (const long64 &val) - { - lo = (ulong64)val; - if (val < 0) hi = -1; else hi = 0; - return *this; - } - - bool operator == (const Int128 &val) const - {return (hi == val.hi && lo == val.lo);} - - bool operator != (const Int128 &val) const - { return !(*this == val);} - - bool operator > (const Int128 &val) const - { - if (hi != val.hi) - return hi > val.hi; - else - return lo > val.lo; - } - - bool operator < (const Int128 &val) const - { - if (hi != val.hi) - return hi < val.hi; - else - return lo < val.lo; - } - - bool operator >= (const Int128 &val) const - { return !(*this < val);} - - bool operator <= (const Int128 &val) const - { return !(*this > val);} - - Int128& operator += (const Int128 &rhs) - { - hi += rhs.hi; - lo += rhs.lo; - if (lo < rhs.lo) hi++; - return *this; - } - - Int128 operator + (const Int128 &rhs) const - { - Int128 result(*this); - result+= rhs; - return result; - } - - Int128& operator -= (const Int128 &rhs) - { - *this += -rhs; - return *this; - } - - Int128 operator - (const Int128 &rhs) const - { - Int128 result(*this); - result -= rhs; - return result; - } - - Int128 operator-() const //unary negation - { - if (lo == 0) - return Int128(-hi, 0); - else - return Int128(~hi, ~lo + 1); - } - - operator double() const - { - const double shift64 = 18446744073709551616.0; //2^64 - if (hi < 0) - { - if (lo == 0) return (double)hi * shift64; - else return -(double)(~lo + ~hi * shift64); - } - else - return (double)(lo + hi * shift64); - } - -}; -//------------------------------------------------------------------------------ - -Int128 Int128Mul (long64 lhs, long64 rhs) -{ - bool negate = (lhs < 0) != (rhs < 0); - - if (lhs < 0) lhs = -lhs; - ulong64 int1Hi = ulong64(lhs) >> 32; - ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF); - - if (rhs < 0) rhs = -rhs; - ulong64 int2Hi = ulong64(rhs) >> 32; - ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF); - - //nb: see comments in clipper.pas - ulong64 a = int1Hi * int2Hi; - ulong64 b = int1Lo * int2Lo; - ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; - - Int128 tmp; - tmp.hi = long64(a + (c >> 32)); - tmp.lo = long64(c << 32); - tmp.lo += long64(b); - if (tmp.lo < b) tmp.hi++; - if (negate) tmp = -tmp; - return tmp; -}; -#endif - -//------------------------------------------------------------------------------ -// Miscellaneous global functions -//------------------------------------------------------------------------------ - -bool Orientation(const Path &poly) -{ - return Area(poly) >= 0; -} -//------------------------------------------------------------------------------ - -double Area(const Path &poly) -{ - int size = (int)poly.size(); - if (size < 3) return 0; - - double a = 0; - for (int i = 0, j = size -1; i < size; ++i) - { - a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); - j = i; - } - return -a * 0.5; -} -//------------------------------------------------------------------------------ - -double Area(const OutPt *op) -{ - const OutPt *startOp = op; - if (!op) return 0; - double a = 0; - do { - a += (double)(op->Prev->Pt.X + op->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y); - op = op->Next; - } while (op != startOp); - return a * 0.5; -} -//------------------------------------------------------------------------------ - -double Area(const OutRec &outRec) -{ - return Area(outRec.Pts); -} -//------------------------------------------------------------------------------ - -bool PointIsVertex(const IntPoint &Pt, OutPt *pp) -{ - OutPt *pp2 = pp; - do - { - if (pp2->Pt == Pt) return true; - pp2 = pp2->Next; - } - while (pp2 != pp); - return false; -} -//------------------------------------------------------------------------------ - -//See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos -//http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf -int PointInPolygon(const IntPoint &pt, const Path &path) -{ - //returns 0 if false, +1 if true, -1 if pt ON polygon boundary - int result = 0; - size_t cnt = path.size(); - if (cnt < 3) return 0; - IntPoint ip = path[0]; - for(size_t i = 1; i <= cnt; ++i) - { - IntPoint ipNext = (i == cnt ? path[0] : path[i]); - if (ipNext.Y == pt.Y) - { - if ((ipNext.X == pt.X) || (ip.Y == pt.Y && - ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; - } - if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) - { - if (ip.X >= pt.X) - { - if (ipNext.X > pt.X) result = 1 - result; - else - { - double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); - if (!d) return -1; - if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; - } - } else - { - if (ipNext.X > pt.X) - { - double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); - if (!d) return -1; - if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; - } - } - } - ip = ipNext; - } - return result; -} -//------------------------------------------------------------------------------ - -int PointInPolygon (const IntPoint &pt, OutPt *op) -{ - //returns 0 if false, +1 if true, -1 if pt ON polygon boundary - int result = 0; - OutPt* startOp = op; - for(;;) - { - if (op->Next->Pt.Y == pt.Y) - { - if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y && - ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) return -1; - } - if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y)) - { - if (op->Pt.X >= pt.X) - { - if (op->Next->Pt.X > pt.X) result = 1 - result; - else - { - double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - - (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); - if (!d) return -1; - if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; - } - } else - { - if (op->Next->Pt.X > pt.X) - { - double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - - (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); - if (!d) return -1; - if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; - } - } - } - op = op->Next; - if (startOp == op) break; - } - return result; -} -//------------------------------------------------------------------------------ - -bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) -{ - OutPt* op = OutPt1; - do - { - //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon - int res = PointInPolygon(op->Pt, OutPt2); - if (res >= 0) return res > 0; - op = op->Next; - } - while (op != OutPt1); - return true; -} -//---------------------------------------------------------------------- - -bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range) -{ -#ifndef use_int32 - if (UseFullInt64Range) - return Int128Mul(e1.Top.Y - e1.Bot.Y, e2.Top.X - e2.Bot.X) == - Int128Mul(e1.Top.X - e1.Bot.X, e2.Top.Y - e2.Bot.Y); - else -#endif - return (e1.Top.Y - e1.Bot.Y) * (e2.Top.X - e2.Bot.X) == - (e1.Top.X - e1.Bot.X) * (e2.Top.Y - e2.Bot.Y); -} -//------------------------------------------------------------------------------ - -bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, - const IntPoint pt3, bool UseFullInt64Range) -{ -#ifndef use_int32 - if (UseFullInt64Range) - return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y); - else -#endif - return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y); -} -//------------------------------------------------------------------------------ - -bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, - const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) -{ -#ifndef use_int32 - if (UseFullInt64Range) - return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y); - else -#endif - return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y); -} -//------------------------------------------------------------------------------ - -inline bool IsHorizontal(TEdge &e) -{ - return e.Dx == HORIZONTAL; -} -//------------------------------------------------------------------------------ - -inline double GetDx(const IntPoint pt1, const IntPoint pt2) -{ - return (pt1.Y == pt2.Y) ? - HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); -} -//--------------------------------------------------------------------------- - -inline void SetDx(TEdge &e) -{ - cInt dy = (e.Top.Y - e.Bot.Y); - if (dy == 0) e.Dx = HORIZONTAL; - else e.Dx = (double)(e.Top.X - e.Bot.X) / dy; -} -//--------------------------------------------------------------------------- - -inline void SwapSides(TEdge &Edge1, TEdge &Edge2) -{ - EdgeSide Side = Edge1.Side; - Edge1.Side = Edge2.Side; - Edge2.Side = Side; -} -//------------------------------------------------------------------------------ - -inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2) -{ - int OutIdx = Edge1.OutIdx; - Edge1.OutIdx = Edge2.OutIdx; - Edge2.OutIdx = OutIdx; -} -//------------------------------------------------------------------------------ - -inline cInt TopX(TEdge &edge, const cInt currentY) -{ - return ( currentY == edge.Top.Y ) ? - edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y)); -} -//------------------------------------------------------------------------------ - -void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) -{ -#ifdef use_xyz - ip.Z = 0; -#endif - - double b1, b2; - if (Edge1.Dx == Edge2.Dx) - { - ip.Y = Edge1.Curr.Y; - ip.X = TopX(Edge1, ip.Y); - return; - } - else if (Edge1.Dx == 0) - { - ip.X = Edge1.Bot.X; - if (IsHorizontal(Edge2)) - ip.Y = Edge2.Bot.Y; - else - { - b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx); - ip.Y = Round(ip.X / Edge2.Dx + b2); - } - } - else if (Edge2.Dx == 0) - { - ip.X = Edge2.Bot.X; - if (IsHorizontal(Edge1)) - ip.Y = Edge1.Bot.Y; - else - { - b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx); - ip.Y = Round(ip.X / Edge1.Dx + b1); - } - } - else - { - b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx; - b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx; - double q = (b2-b1) / (Edge1.Dx - Edge2.Dx); - ip.Y = Round(q); - if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) - ip.X = Round(Edge1.Dx * q + b1); - else - ip.X = Round(Edge2.Dx * q + b2); - } - - if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) - { - if (Edge1.Top.Y > Edge2.Top.Y) - ip.Y = Edge1.Top.Y; - else - ip.Y = Edge2.Top.Y; - if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) - ip.X = TopX(Edge1, ip.Y); - else - ip.X = TopX(Edge2, ip.Y); - } - //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... - if (ip.Y > Edge1.Curr.Y) - { - ip.Y = Edge1.Curr.Y; - //use the more vertical edge to derive X ... - if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) - ip.X = TopX(Edge2, ip.Y); else - ip.X = TopX(Edge1, ip.Y); - } -} -//------------------------------------------------------------------------------ - -void ReversePolyPtLinks(OutPt *pp) -{ - if (!pp) return; - OutPt *pp1, *pp2; - pp1 = pp; - do { - pp2 = pp1->Next; - pp1->Next = pp1->Prev; - pp1->Prev = pp2; - pp1 = pp2; - } while( pp1 != pp ); -} -//------------------------------------------------------------------------------ - -void DisposeOutPts(OutPt*& pp) -{ - if (pp == 0) return; - pp->Prev->Next = 0; - while( pp ) - { - OutPt *tmpPp = pp; - pp = pp->Next; - delete tmpPp; - } -} -//------------------------------------------------------------------------------ - -inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt) -{ - std::memset(e, 0, sizeof(TEdge)); - e->Next = eNext; - e->Prev = ePrev; - e->Curr = Pt; - e->OutIdx = Unassigned; -} -//------------------------------------------------------------------------------ - -void InitEdge2(TEdge& e, PolyType Pt) -{ - if (e.Curr.Y >= e.Next->Curr.Y) - { - e.Bot = e.Curr; - e.Top = e.Next->Curr; - } else - { - e.Top = e.Curr; - e.Bot = e.Next->Curr; - } - SetDx(e); - e.PolyTyp = Pt; -} -//------------------------------------------------------------------------------ - -TEdge* RemoveEdge(TEdge* e) -{ - //removes e from double_linked_list (but without removing from memory) - e->Prev->Next = e->Next; - e->Next->Prev = e->Prev; - TEdge* result = e->Next; - e->Prev = 0; //flag as removed (see ClipperBase.Clear) - return result; -} -//------------------------------------------------------------------------------ - -inline void ReverseHorizontal(TEdge &e) -{ - //swap horizontal edges' Top and Bottom x's so they follow the natural - //progression of the bounds - ie so their xbots will align with the - //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] - std::swap(e.Top.X, e.Bot.X); -#ifdef use_xyz - std::swap(e.Top.Z, e.Bot.Z); -#endif -} -//------------------------------------------------------------------------------ - -void SwapPoints(IntPoint &pt1, IntPoint &pt2) -{ - IntPoint tmp = pt1; - pt1 = pt2; - pt2 = tmp; -} -//------------------------------------------------------------------------------ - -bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, - IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) -{ - //precondition: segments are Collinear. - if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y)) - { - if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b); - if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b); - if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a; - if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b; - return pt1.X < pt2.X; - } else - { - if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b); - if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b); - if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a; - if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b; - return pt1.Y > pt2.Y; - } -} -//------------------------------------------------------------------------------ - -bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) -{ - OutPt *p = btmPt1->Prev; - while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Prev; - double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt)); - p = btmPt1->Next; - while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Next; - double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt)); - - p = btmPt2->Prev; - while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Prev; - double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt)); - p = btmPt2->Next; - while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next; - double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt)); - - if (std::max(dx1p, dx1n) == std::max(dx2p, dx2n) && - std::min(dx1p, dx1n) == std::min(dx2p, dx2n)) - return Area(btmPt1) > 0; //if otherwise identical use orientation - else - return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); -} -//------------------------------------------------------------------------------ - -OutPt* GetBottomPt(OutPt *pp) -{ - OutPt* dups = 0; - OutPt* p = pp->Next; - while (p != pp) - { - if (p->Pt.Y > pp->Pt.Y) - { - pp = p; - dups = 0; - } - else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X) - { - if (p->Pt.X < pp->Pt.X) - { - dups = 0; - pp = p; - } else - { - if (p->Next != pp && p->Prev != pp) dups = p; - } - } - p = p->Next; - } - if (dups) - { - //there appears to be at least 2 vertices at BottomPt so ... - while (dups != p) - { - if (!FirstIsBottomPt(p, dups)) pp = dups; - dups = dups->Next; - while (dups->Pt != pp->Pt) dups = dups->Next; - } - } - return pp; -} -//------------------------------------------------------------------------------ - -bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, - const IntPoint pt2, const IntPoint pt3) -{ - if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) - return false; - else if (pt1.X != pt3.X) - return (pt2.X > pt1.X) == (pt2.X < pt3.X); - else - return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); -} -//------------------------------------------------------------------------------ - -bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) -{ - if (seg1a > seg1b) std::swap(seg1a, seg1b); - if (seg2a > seg2b) std::swap(seg2a, seg2b); - return (seg1a < seg2b) && (seg2a < seg1b); -} - -//------------------------------------------------------------------------------ -// ClipperBase class methods ... -//------------------------------------------------------------------------------ - -ClipperBase::ClipperBase() //constructor -{ - m_CurrentLM = m_MinimaList.begin(); //begin() == end() here - m_UseFullRange = false; -} -//------------------------------------------------------------------------------ - -ClipperBase::~ClipperBase() //destructor -{ - Clear(); -} -//------------------------------------------------------------------------------ - -void RangeTest(const IntPoint& Pt, bool& useFullRange) -{ - if (useFullRange) - { - if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) - throw clipperException("Coordinate outside allowed range"); - } - else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) - { - useFullRange = true; - RangeTest(Pt, useFullRange); - } -} -//------------------------------------------------------------------------------ - -TEdge* FindNextLocMin(TEdge* E) -{ - for (;;) - { - while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next; - if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break; - while (IsHorizontal(*E->Prev)) E = E->Prev; - TEdge* E2 = E; - while (IsHorizontal(*E)) E = E->Next; - if (E->Top.Y == E->Prev->Bot.Y) continue; //ie just an intermediate horz. - if (E2->Prev->Bot.X < E->Bot.X) E = E2; - break; - } - return E; -} -//------------------------------------------------------------------------------ - -TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) -{ - TEdge *Result = E; - TEdge *Horz = 0; - - if (E->OutIdx == Skip) - { - //if edges still remain in the current bound beyond the skip edge then - //create another LocMin and call ProcessBound once more - if (NextIsForward) - { - while (E->Top.Y == E->Next->Bot.Y) E = E->Next; - //don't include top horizontals when parsing a bound a second time, - //they will be contained in the opposite bound ... - while (E != Result && IsHorizontal(*E)) E = E->Prev; - } - else - { - while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev; - while (E != Result && IsHorizontal(*E)) E = E->Next; - } - - if (E == Result) - { - if (NextIsForward) Result = E->Next; - else Result = E->Prev; - } - else - { - //there are more edges in the bound beyond result starting with E - if (NextIsForward) - E = Result->Next; - else - E = Result->Prev; - MinimaList::value_type locMin; - locMin.Y = E->Bot.Y; - locMin.LeftBound = 0; - locMin.RightBound = E; - E->WindDelta = 0; - Result = ProcessBound(E, NextIsForward); - m_MinimaList.push_back(locMin); - } - return Result; - } - - TEdge *EStart; - - if (IsHorizontal(*E)) - { - //We need to be careful with open paths because this may not be a - //true local minima (ie E may be following a skip edge). - //Also, consecutive horz. edges may start heading left before going right. - if (NextIsForward) - EStart = E->Prev; - else - EStart = E->Next; - if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge - { - if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X) - ReverseHorizontal(*E); - } - else if (EStart->Bot.X != E->Bot.X) - ReverseHorizontal(*E); - } - - EStart = E; - if (NextIsForward) - { - while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) - Result = Result->Next; - if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) - { - //nb: at the top of a bound, horizontals are added to the bound - //only when the preceding edge attaches to the horizontal's left vertex - //unless a Skip edge is encountered when that becomes the top divide - Horz = Result; - while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev; - if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev; - } - while (E != Result) - { - E->NextInLML = E->Next; - if (IsHorizontal(*E) && E != EStart && - E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); - E = E->Next; - } - if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) - ReverseHorizontal(*E); - Result = Result->Next; //move to the edge just beyond current bound - } else - { - while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) - Result = Result->Prev; - if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) - { - Horz = Result; - while (IsHorizontal(*Horz->Next)) Horz = Horz->Next; - if (Horz->Next->Top.X == Result->Prev->Top.X || - Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next; - } - - while (E != Result) - { - E->NextInLML = E->Prev; - if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) - ReverseHorizontal(*E); - E = E->Prev; - } - if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) - ReverseHorizontal(*E); - Result = Result->Prev; //move to the edge just beyond current bound - } - - return Result; -} -//------------------------------------------------------------------------------ - -bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) -{ -#ifdef use_lines - if (!Closed && PolyTyp == ptClip) - throw clipperException("AddPath: Open paths must be subject."); -#else - if (!Closed) - throw clipperException("AddPath: Open paths have been disabled."); -#endif - - int highI = (int)pg.size() -1; - if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; - while (highI > 0 && (pg[highI] == pg[highI -1])) --highI; - if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; - - //create a new edge array ... - TEdge *edges = new TEdge [highI +1]; - - bool IsFlat = true; - //1. Basic (first) edge initialization ... - try - { - edges[1].Curr = pg[1]; - RangeTest(pg[0], m_UseFullRange); - RangeTest(pg[highI], m_UseFullRange); - InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]); - InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); - for (int i = highI - 1; i >= 1; --i) - { - RangeTest(pg[i], m_UseFullRange); - InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); - } - } - catch(...) - { - delete [] edges; - throw; //range test fails - } - TEdge *eStart = &edges[0]; - - //2. Remove duplicate vertices, and (when closed) collinear edges ... - TEdge *E = eStart, *eLoopStop = eStart; - for (;;) - { - //nb: allows matching start and end points when not Closed ... - if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart)) - { - if (E == E->Next) break; - if (E == eStart) eStart = E->Next; - E = RemoveEdge(E); - eLoopStop = E; - continue; - } - if (E->Prev == E->Next) - break; //only two vertices - else if (Closed && - SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) && - (!m_PreserveCollinear || - !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr))) - { - //Collinear edges are allowed for open paths but in closed paths - //the default is to merge adjacent collinear edges into a single edge. - //However, if the PreserveCollinear property is enabled, only overlapping - //collinear edges (ie spikes) will be removed from closed paths. - if (E == eStart) eStart = E->Next; - E = RemoveEdge(E); - E = E->Prev; - eLoopStop = E; - continue; - } - E = E->Next; - if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break; - } - - if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next))) - { - delete [] edges; - return false; - } - - if (!Closed) - { - m_HasOpenPaths = true; - eStart->Prev->OutIdx = Skip; - } - - //3. Do second stage of edge initialization ... - E = eStart; - do - { - InitEdge2(*E, PolyTyp); - E = E->Next; - if (IsFlat && E->Curr.Y != eStart->Curr.Y) IsFlat = false; - } - while (E != eStart); - - //4. Finally, add edge bounds to LocalMinima list ... - - //Totally flat paths must be handled differently when adding them - //to LocalMinima list to avoid endless loops etc ... - if (IsFlat) - { - if (Closed) - { - delete [] edges; - return false; - } - E->Prev->OutIdx = Skip; - MinimaList::value_type locMin; - locMin.Y = E->Bot.Y; - locMin.LeftBound = 0; - locMin.RightBound = E; - locMin.RightBound->Side = esRight; - locMin.RightBound->WindDelta = 0; - for (;;) - { - if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); - if (E->Next->OutIdx == Skip) break; - E->NextInLML = E->Next; - E = E->Next; - } - m_MinimaList.push_back(locMin); - m_edges.push_back(edges); - return true; - } - - m_edges.push_back(edges); - bool leftBoundIsForward; - TEdge* EMin = 0; - - //workaround to avoid an endless loop in the while loop below when - //open paths have matching start and end points ... - if (E->Prev->Bot == E->Prev->Top) E = E->Next; - - for (;;) - { - E = FindNextLocMin(E); - if (E == EMin) break; - else if (!EMin) EMin = E; - - //E and E.Prev now share a local minima (left aligned if horizontal). - //Compare their slopes to find which starts which bound ... - MinimaList::value_type locMin; - locMin.Y = E->Bot.Y; - if (E->Dx < E->Prev->Dx) - { - locMin.LeftBound = E->Prev; - locMin.RightBound = E; - leftBoundIsForward = false; //Q.nextInLML = Q.prev - } else - { - locMin.LeftBound = E; - locMin.RightBound = E->Prev; - leftBoundIsForward = true; //Q.nextInLML = Q.next - } - - if (!Closed) locMin.LeftBound->WindDelta = 0; - else if (locMin.LeftBound->Next == locMin.RightBound) - locMin.LeftBound->WindDelta = -1; - else locMin.LeftBound->WindDelta = 1; - locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta; - - E = ProcessBound(locMin.LeftBound, leftBoundIsForward); - if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); - - TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); - if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); - - if (locMin.LeftBound->OutIdx == Skip) - locMin.LeftBound = 0; - else if (locMin.RightBound->OutIdx == Skip) - locMin.RightBound = 0; - m_MinimaList.push_back(locMin); - if (!leftBoundIsForward) E = E2; - } - return true; -} -//------------------------------------------------------------------------------ - -bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed) -{ - bool result = false; - for (Paths::size_type i = 0; i < ppg.size(); ++i) - if (AddPath(ppg[i], PolyTyp, Closed)) result = true; - return result; -} -//------------------------------------------------------------------------------ - -void ClipperBase::Clear() -{ - DisposeLocalMinimaList(); - for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) - { - TEdge* edges = m_edges[i]; - delete [] edges; - } - m_edges.clear(); - m_UseFullRange = false; - m_HasOpenPaths = false; -} -//------------------------------------------------------------------------------ - -void ClipperBase::Reset() -{ - m_CurrentLM = m_MinimaList.begin(); - if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process - std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter()); - - m_Scanbeam = ScanbeamList(); //clears/resets priority_queue - //reset all edges ... - for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) - { - InsertScanbeam(lm->Y); - TEdge* e = lm->LeftBound; - if (e) - { - e->Curr = e->Bot; - e->Side = esLeft; - e->OutIdx = Unassigned; - } - - e = lm->RightBound; - if (e) - { - e->Curr = e->Bot; - e->Side = esRight; - e->OutIdx = Unassigned; - } - } - m_ActiveEdges = 0; - m_CurrentLM = m_MinimaList.begin(); -} -//------------------------------------------------------------------------------ - -void ClipperBase::DisposeLocalMinimaList() -{ - m_MinimaList.clear(); - m_CurrentLM = m_MinimaList.begin(); -} -//------------------------------------------------------------------------------ - -bool ClipperBase::PopLocalMinima(cInt Y, const LocalMinimum *&locMin) -{ - if (m_CurrentLM == m_MinimaList.end() || (*m_CurrentLM).Y != Y) return false; - locMin = &(*m_CurrentLM); - ++m_CurrentLM; - return true; -} -//------------------------------------------------------------------------------ - -IntRect ClipperBase::GetBounds() -{ - IntRect result; - MinimaList::iterator lm = m_MinimaList.begin(); - if (lm == m_MinimaList.end()) - { - result.left = result.top = result.right = result.bottom = 0; - return result; - } - result.left = lm->LeftBound->Bot.X; - result.top = lm->LeftBound->Bot.Y; - result.right = lm->LeftBound->Bot.X; - result.bottom = lm->LeftBound->Bot.Y; - while (lm != m_MinimaList.end()) - { - //todo - needs fixing for open paths - result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y); - TEdge* e = lm->LeftBound; - for (;;) { - TEdge* bottomE = e; - while (e->NextInLML) - { - if (e->Bot.X < result.left) result.left = e->Bot.X; - if (e->Bot.X > result.right) result.right = e->Bot.X; - e = e->NextInLML; - } - result.left = std::min(result.left, e->Bot.X); - result.right = std::max(result.right, e->Bot.X); - result.left = std::min(result.left, e->Top.X); - result.right = std::max(result.right, e->Top.X); - result.top = std::min(result.top, e->Top.Y); - if (bottomE == lm->LeftBound) e = lm->RightBound; - else break; - } - ++lm; - } - return result; -} -//------------------------------------------------------------------------------ - -void ClipperBase::InsertScanbeam(const cInt Y) -{ - m_Scanbeam.push(Y); -} -//------------------------------------------------------------------------------ - -bool ClipperBase::PopScanbeam(cInt &Y) -{ - if (m_Scanbeam.empty()) return false; - Y = m_Scanbeam.top(); - m_Scanbeam.pop(); - while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates. - return true; -} -//------------------------------------------------------------------------------ - -void ClipperBase::DisposeAllOutRecs(){ - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - DisposeOutRec(i); - m_PolyOuts.clear(); -} -//------------------------------------------------------------------------------ - -void ClipperBase::DisposeOutRec(PolyOutList::size_type index) -{ - OutRec *outRec = m_PolyOuts[index]; - if (outRec->Pts) DisposeOutPts(outRec->Pts); - delete outRec; - m_PolyOuts[index] = 0; -} -//------------------------------------------------------------------------------ - -void ClipperBase::DeleteFromAEL(TEdge *e) -{ - TEdge* AelPrev = e->PrevInAEL; - TEdge* AelNext = e->NextInAEL; - if (!AelPrev && !AelNext && (e != m_ActiveEdges)) return; //already deleted - if (AelPrev) AelPrev->NextInAEL = AelNext; - else m_ActiveEdges = AelNext; - if (AelNext) AelNext->PrevInAEL = AelPrev; - e->NextInAEL = 0; - e->PrevInAEL = 0; -} -//------------------------------------------------------------------------------ - -OutRec* ClipperBase::CreateOutRec() -{ - OutRec* result = new OutRec; - result->IsHole = false; - result->IsOpen = false; - result->FirstLeft = 0; - result->Pts = 0; - result->BottomPt = 0; - result->PolyNd = 0; - m_PolyOuts.push_back(result); - result->Idx = (int)m_PolyOuts.size() - 1; - return result; -} -//------------------------------------------------------------------------------ - -void ClipperBase::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2) -{ - //check that one or other edge hasn't already been removed from AEL ... - if (Edge1->NextInAEL == Edge1->PrevInAEL || - Edge2->NextInAEL == Edge2->PrevInAEL) return; - - if (Edge1->NextInAEL == Edge2) - { - TEdge* Next = Edge2->NextInAEL; - if (Next) Next->PrevInAEL = Edge1; - TEdge* Prev = Edge1->PrevInAEL; - if (Prev) Prev->NextInAEL = Edge2; - Edge2->PrevInAEL = Prev; - Edge2->NextInAEL = Edge1; - Edge1->PrevInAEL = Edge2; - Edge1->NextInAEL = Next; - } - else if (Edge2->NextInAEL == Edge1) - { - TEdge* Next = Edge1->NextInAEL; - if (Next) Next->PrevInAEL = Edge2; - TEdge* Prev = Edge2->PrevInAEL; - if (Prev) Prev->NextInAEL = Edge1; - Edge1->PrevInAEL = Prev; - Edge1->NextInAEL = Edge2; - Edge2->PrevInAEL = Edge1; - Edge2->NextInAEL = Next; - } - else - { - TEdge* Next = Edge1->NextInAEL; - TEdge* Prev = Edge1->PrevInAEL; - Edge1->NextInAEL = Edge2->NextInAEL; - if (Edge1->NextInAEL) Edge1->NextInAEL->PrevInAEL = Edge1; - Edge1->PrevInAEL = Edge2->PrevInAEL; - if (Edge1->PrevInAEL) Edge1->PrevInAEL->NextInAEL = Edge1; - Edge2->NextInAEL = Next; - if (Edge2->NextInAEL) Edge2->NextInAEL->PrevInAEL = Edge2; - Edge2->PrevInAEL = Prev; - if (Edge2->PrevInAEL) Edge2->PrevInAEL->NextInAEL = Edge2; - } - - if (!Edge1->PrevInAEL) m_ActiveEdges = Edge1; - else if (!Edge2->PrevInAEL) m_ActiveEdges = Edge2; -} -//------------------------------------------------------------------------------ - -void ClipperBase::UpdateEdgeIntoAEL(TEdge *&e) -{ - if (!e->NextInLML) - throw clipperException("UpdateEdgeIntoAEL: invalid call"); - - e->NextInLML->OutIdx = e->OutIdx; - TEdge* AelPrev = e->PrevInAEL; - TEdge* AelNext = e->NextInAEL; - if (AelPrev) AelPrev->NextInAEL = e->NextInLML; - else m_ActiveEdges = e->NextInLML; - if (AelNext) AelNext->PrevInAEL = e->NextInLML; - e->NextInLML->Side = e->Side; - e->NextInLML->WindDelta = e->WindDelta; - e->NextInLML->WindCnt = e->WindCnt; - e->NextInLML->WindCnt2 = e->WindCnt2; - e = e->NextInLML; - e->Curr = e->Bot; - e->PrevInAEL = AelPrev; - e->NextInAEL = AelNext; - if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y); -} -//------------------------------------------------------------------------------ - -bool ClipperBase::LocalMinimaPending() -{ - return (m_CurrentLM != m_MinimaList.end()); -} - -//------------------------------------------------------------------------------ -// TClipper methods ... -//------------------------------------------------------------------------------ - -Clipper::Clipper(int initOptions) : ClipperBase() //constructor -{ - m_ExecuteLocked = false; - m_UseFullRange = false; - m_ReverseOutput = ((initOptions & ioReverseSolution) != 0); - m_StrictSimple = ((initOptions & ioStrictlySimple) != 0); - m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0); - m_HasOpenPaths = false; -#ifdef use_xyz - m_ZFill = 0; -#endif -} -//------------------------------------------------------------------------------ - -#ifdef use_xyz -void Clipper::ZFillFunction(ZFillCallback zFillFunc) -{ - m_ZFill = zFillFunc; -} -//------------------------------------------------------------------------------ -#endif - -bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType) -{ - return Execute(clipType, solution, fillType, fillType); -} -//------------------------------------------------------------------------------ - -bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType) -{ - return Execute(clipType, polytree, fillType, fillType); -} -//------------------------------------------------------------------------------ - -bool Clipper::Execute(ClipType clipType, Paths &solution, - PolyFillType subjFillType, PolyFillType clipFillType) -{ - if( m_ExecuteLocked ) return false; - if (m_HasOpenPaths) - throw clipperException("Error: PolyTree struct is needed for open path clipping."); - m_ExecuteLocked = true; - solution.resize(0); - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = false; - bool succeeded = ExecuteInternal(); - if (succeeded) BuildResult(solution); - DisposeAllOutRecs(); - m_ExecuteLocked = false; - return succeeded; -} -//------------------------------------------------------------------------------ - -bool Clipper::Execute(ClipType clipType, PolyTree& polytree, - PolyFillType subjFillType, PolyFillType clipFillType) -{ - if( m_ExecuteLocked ) return false; - m_ExecuteLocked = true; - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = true; - bool succeeded = ExecuteInternal(); - if (succeeded) BuildResult2(polytree); - DisposeAllOutRecs(); - m_ExecuteLocked = false; - return succeeded; -} -//------------------------------------------------------------------------------ - -void Clipper::FixHoleLinkage(OutRec &outrec) -{ - //skip OutRecs that (a) contain outermost polygons or - //(b) already have the correct owner/child linkage ... - if (!outrec.FirstLeft || - (outrec.IsHole != outrec.FirstLeft->IsHole && - outrec.FirstLeft->Pts)) return; - - OutRec* orfl = outrec.FirstLeft; - while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts)) - orfl = orfl->FirstLeft; - outrec.FirstLeft = orfl; -} -//------------------------------------------------------------------------------ - -bool Clipper::ExecuteInternal() -{ - bool succeeded = true; - try { - Reset(); - m_Maxima = MaximaList(); - m_SortedEdges = 0; - - succeeded = true; - cInt botY, topY; - if (!PopScanbeam(botY)) return false; - InsertLocalMinimaIntoAEL(botY); - while (PopScanbeam(topY) || LocalMinimaPending()) - { - ProcessHorizontals(); - ClearGhostJoins(); - if (!ProcessIntersections(topY)) - { - succeeded = false; - break; - } - ProcessEdgesAtTopOfScanbeam(topY); - botY = topY; - InsertLocalMinimaIntoAEL(botY); - } - } - catch(...) - { - succeeded = false; - } - - if (succeeded) - { - //fix orientations ... - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec *outRec = m_PolyOuts[i]; - if (!outRec->Pts || outRec->IsOpen) continue; - if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0)) - ReversePolyPtLinks(outRec->Pts); - } - - if (!m_Joins.empty()) JoinCommonEdges(); - - //unfortunately FixupOutPolygon() must be done after JoinCommonEdges() - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec *outRec = m_PolyOuts[i]; - if (!outRec->Pts) continue; - if (outRec->IsOpen) - FixupOutPolyline(*outRec); - else - FixupOutPolygon(*outRec); - } - - if (m_StrictSimple) DoSimplePolygons(); - } - - ClearJoins(); - ClearGhostJoins(); - return succeeded; -} -//------------------------------------------------------------------------------ - -void Clipper::SetWindingCount(TEdge &edge) -{ - TEdge *e = edge.PrevInAEL; - //find the edge of the same polytype that immediately preceeds 'edge' in AEL - while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) e = e->PrevInAEL; - if (!e) - { - if (edge.WindDelta == 0) - { - PolyFillType pft = (edge.PolyTyp == ptSubject ? m_SubjFillType : m_ClipFillType); - edge.WindCnt = (pft == pftNegative ? -1 : 1); - } - else - edge.WindCnt = edge.WindDelta; - edge.WindCnt2 = 0; - e = m_ActiveEdges; //ie get ready to calc WindCnt2 - } - else if (edge.WindDelta == 0 && m_ClipType != ctUnion) - { - edge.WindCnt = 1; - edge.WindCnt2 = e->WindCnt2; - e = e->NextInAEL; //ie get ready to calc WindCnt2 - } - else if (IsEvenOddFillType(edge)) - { - //EvenOdd filling ... - if (edge.WindDelta == 0) - { - //are we inside a subj polygon ... - bool Inside = true; - TEdge *e2 = e->PrevInAEL; - while (e2) - { - if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0) - Inside = !Inside; - e2 = e2->PrevInAEL; - } - edge.WindCnt = (Inside ? 0 : 1); - } - else - { - edge.WindCnt = edge.WindDelta; - } - edge.WindCnt2 = e->WindCnt2; - e = e->NextInAEL; //ie get ready to calc WindCnt2 - } - else - { - //nonZero, Positive or Negative filling ... - if (e->WindCnt * e->WindDelta < 0) - { - //prev edge is 'decreasing' WindCount (WC) toward zero - //so we're outside the previous polygon ... - if (Abs(e->WindCnt) > 1) - { - //outside prev poly but still inside another. - //when reversing direction of prev poly use the same WC - if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; - //otherwise continue to 'decrease' WC ... - else edge.WindCnt = e->WindCnt + edge.WindDelta; - } - else - //now outside all polys of same polytype so set own WC ... - edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); - } else - { - //prev edge is 'increasing' WindCount (WC) away from zero - //so we're inside the previous polygon ... - if (edge.WindDelta == 0) - edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1); - //if wind direction is reversing prev then use same WC - else if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; - //otherwise add to WC ... - else edge.WindCnt = e->WindCnt + edge.WindDelta; - } - edge.WindCnt2 = e->WindCnt2; - e = e->NextInAEL; //ie get ready to calc WindCnt2 - } - - //update WindCnt2 ... - if (IsEvenOddAltFillType(edge)) - { - //EvenOdd filling ... - while (e != &edge) - { - if (e->WindDelta != 0) - edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); - e = e->NextInAEL; - } - } else - { - //nonZero, Positive or Negative filling ... - while ( e != &edge ) - { - edge.WindCnt2 += e->WindDelta; - e = e->NextInAEL; - } - } -} -//------------------------------------------------------------------------------ - -bool Clipper::IsEvenOddFillType(const TEdge& edge) const -{ - if (edge.PolyTyp == ptSubject) - return m_SubjFillType == pftEvenOdd; else - return m_ClipFillType == pftEvenOdd; -} -//------------------------------------------------------------------------------ - -bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const -{ - if (edge.PolyTyp == ptSubject) - return m_ClipFillType == pftEvenOdd; else - return m_SubjFillType == pftEvenOdd; -} -//------------------------------------------------------------------------------ - -bool Clipper::IsContributing(const TEdge& edge) const -{ - PolyFillType pft, pft2; - if (edge.PolyTyp == ptSubject) - { - pft = m_SubjFillType; - pft2 = m_ClipFillType; - } else - { - pft = m_ClipFillType; - pft2 = m_SubjFillType; - } - - switch(pft) - { - case pftEvenOdd: - //return false if a subj line has been flagged as inside a subj polygon - if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; - break; - case pftNonZero: - if (Abs(edge.WindCnt) != 1) return false; - break; - case pftPositive: - if (edge.WindCnt != 1) return false; - break; - default: //pftNegative - if (edge.WindCnt != -1) return false; - } - - switch(m_ClipType) - { - case ctIntersection: - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.WindCnt2 != 0); - case pftPositive: - return (edge.WindCnt2 > 0); - default: - return (edge.WindCnt2 < 0); - } - break; - case ctUnion: - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.WindCnt2 == 0); - case pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } - break; - case ctDifference: - if (edge.PolyTyp == ptSubject) - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.WindCnt2 == 0); - case pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } - else - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.WindCnt2 != 0); - case pftPositive: - return (edge.WindCnt2 > 0); - default: - return (edge.WindCnt2 < 0); - } - break; - case ctXor: - if (edge.WindDelta == 0) //XOr always contributing unless open - switch(pft2) - { - case pftEvenOdd: - case pftNonZero: - return (edge.WindCnt2 == 0); - case pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } - else - return true; - break; - default: - return true; - } -} -//------------------------------------------------------------------------------ - -OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) -{ - OutPt* result; - TEdge *e, *prevE; - if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx )) - { - result = AddOutPt(e1, Pt); - e2->OutIdx = e1->OutIdx; - e1->Side = esLeft; - e2->Side = esRight; - e = e1; - if (e->PrevInAEL == e2) - prevE = e2->PrevInAEL; - else - prevE = e->PrevInAEL; - } else - { - result = AddOutPt(e2, Pt); - e1->OutIdx = e2->OutIdx; - e1->Side = esRight; - e2->Side = esLeft; - e = e2; - if (e->PrevInAEL == e1) - prevE = e1->PrevInAEL; - else - prevE = e->PrevInAEL; - } - - if (prevE && prevE->OutIdx >= 0 && prevE->Top.Y < Pt.Y && e->Top.Y < Pt.Y) - { - cInt xPrev = TopX(*prevE, Pt.Y); - cInt xE = TopX(*e, Pt.Y); - if (xPrev == xE && (e->WindDelta != 0) && (prevE->WindDelta != 0) && - SlopesEqual(IntPoint(xPrev, Pt.Y), prevE->Top, IntPoint(xE, Pt.Y), e->Top, m_UseFullRange)) - { - OutPt* outPt = AddOutPt(prevE, Pt); - AddJoin(result, outPt, e->Top); - } - } - return result; -} -//------------------------------------------------------------------------------ - -void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) -{ - AddOutPt( e1, Pt ); - if (e2->WindDelta == 0) AddOutPt(e2, Pt); - if( e1->OutIdx == e2->OutIdx ) - { - e1->OutIdx = Unassigned; - e2->OutIdx = Unassigned; - } - else if (e1->OutIdx < e2->OutIdx) - AppendPolygon(e1, e2); - else - AppendPolygon(e2, e1); -} -//------------------------------------------------------------------------------ - -void Clipper::AddEdgeToSEL(TEdge *edge) -{ - //SEL pointers in PEdge are reused to build a list of horizontal edges. - //However, we don't need to worry about order with horizontal edge processing. - if( !m_SortedEdges ) - { - m_SortedEdges = edge; - edge->PrevInSEL = 0; - edge->NextInSEL = 0; - } - else - { - edge->NextInSEL = m_SortedEdges; - edge->PrevInSEL = 0; - m_SortedEdges->PrevInSEL = edge; - m_SortedEdges = edge; - } -} -//------------------------------------------------------------------------------ - -bool Clipper::PopEdgeFromSEL(TEdge *&edge) -{ - if (!m_SortedEdges) return false; - edge = m_SortedEdges; - DeleteFromSEL(m_SortedEdges); - return true; -} -//------------------------------------------------------------------------------ - -void Clipper::CopyAELToSEL() -{ - TEdge* e = m_ActiveEdges; - m_SortedEdges = e; - while ( e ) - { - e->PrevInSEL = e->PrevInAEL; - e->NextInSEL = e->NextInAEL; - e = e->NextInAEL; - } -} -//------------------------------------------------------------------------------ - -void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint OffPt) -{ - Join* j = new Join; - j->OutPt1 = op1; - j->OutPt2 = op2; - j->OffPt = OffPt; - m_Joins.push_back(j); -} -//------------------------------------------------------------------------------ - -void Clipper::ClearJoins() -{ - for (JoinList::size_type i = 0; i < m_Joins.size(); i++) - delete m_Joins[i]; - m_Joins.resize(0); -} -//------------------------------------------------------------------------------ - -void Clipper::ClearGhostJoins() -{ - for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++) - delete m_GhostJoins[i]; - m_GhostJoins.resize(0); -} -//------------------------------------------------------------------------------ - -void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt) -{ - Join* j = new Join; - j->OutPt1 = op; - j->OutPt2 = 0; - j->OffPt = OffPt; - m_GhostJoins.push_back(j); -} -//------------------------------------------------------------------------------ - -void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) -{ - const LocalMinimum *lm; - while (PopLocalMinima(botY, lm)) - { - TEdge* lb = lm->LeftBound; - TEdge* rb = lm->RightBound; - - OutPt *Op1 = 0; - if (!lb) - { - //nb: don't insert LB into either AEL or SEL - InsertEdgeIntoAEL(rb, 0); - SetWindingCount(*rb); - if (IsContributing(*rb)) - Op1 = AddOutPt(rb, rb->Bot); - } - else if (!rb) - { - InsertEdgeIntoAEL(lb, 0); - SetWindingCount(*lb); - if (IsContributing(*lb)) - Op1 = AddOutPt(lb, lb->Bot); - InsertScanbeam(lb->Top.Y); - } - else - { - InsertEdgeIntoAEL(lb, 0); - InsertEdgeIntoAEL(rb, lb); - SetWindingCount( *lb ); - rb->WindCnt = lb->WindCnt; - rb->WindCnt2 = lb->WindCnt2; - if (IsContributing(*lb)) - Op1 = AddLocalMinPoly(lb, rb, lb->Bot); - InsertScanbeam(lb->Top.Y); - } - - if (rb) - { - if (IsHorizontal(*rb)) - { - AddEdgeToSEL(rb); - if (rb->NextInLML) - InsertScanbeam(rb->NextInLML->Top.Y); - } - else InsertScanbeam( rb->Top.Y ); - } - - if (!lb || !rb) continue; - - //if any output polygons share an edge, they'll need joining later ... - if (Op1 && IsHorizontal(*rb) && - m_GhostJoins.size() > 0 && (rb->WindDelta != 0)) - { - for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i) - { - Join* jr = m_GhostJoins[i]; - //if the horizontal Rb and a 'ghost' horizontal overlap, then convert - //the 'ghost' join to a real join ready for later ... - if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X)) - AddJoin(jr->OutPt1, Op1, jr->OffPt); - } - } - - if (lb->OutIdx >= 0 && lb->PrevInAEL && - lb->PrevInAEL->Curr.X == lb->Bot.X && - lb->PrevInAEL->OutIdx >= 0 && - SlopesEqual(lb->PrevInAEL->Bot, lb->PrevInAEL->Top, lb->Curr, lb->Top, m_UseFullRange) && - (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0)) - { - OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot); - AddJoin(Op1, Op2, lb->Top); - } - - if(lb->NextInAEL != rb) - { - - if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 && - SlopesEqual(rb->PrevInAEL->Curr, rb->PrevInAEL->Top, rb->Curr, rb->Top, m_UseFullRange) && - (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0)) - { - OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot); - AddJoin(Op1, Op2, rb->Top); - } - - TEdge* e = lb->NextInAEL; - if (e) - { - while( e != rb ) - { - //nb: For calculating winding counts etc, IntersectEdges() assumes - //that param1 will be to the Right of param2 ABOVE the intersection ... - IntersectEdges(rb , e , lb->Curr); //order important here - e = e->NextInAEL; - } - } - } - - } -} -//------------------------------------------------------------------------------ - -void Clipper::DeleteFromSEL(TEdge *e) -{ - TEdge* SelPrev = e->PrevInSEL; - TEdge* SelNext = e->NextInSEL; - if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted - if( SelPrev ) SelPrev->NextInSEL = SelNext; - else m_SortedEdges = SelNext; - if( SelNext ) SelNext->PrevInSEL = SelPrev; - e->NextInSEL = 0; - e->PrevInSEL = 0; -} -//------------------------------------------------------------------------------ - -#ifdef use_xyz -void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2) -{ - if (pt.Z != 0 || !m_ZFill) return; - else if (pt == e1.Bot) pt.Z = e1.Bot.Z; - else if (pt == e1.Top) pt.Z = e1.Top.Z; - else if (pt == e2.Bot) pt.Z = e2.Bot.Z; - else if (pt == e2.Top) pt.Z = e2.Top.Z; - else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt); -} -//------------------------------------------------------------------------------ -#endif - -void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt) -{ - bool e1Contributing = ( e1->OutIdx >= 0 ); - bool e2Contributing = ( e2->OutIdx >= 0 ); - -#ifdef use_xyz - SetZ(Pt, *e1, *e2); -#endif - -#ifdef use_lines - //if either edge is on an OPEN path ... - if (e1->WindDelta == 0 || e2->WindDelta == 0) - { - //ignore subject-subject open path intersections UNLESS they - //are both open paths, AND they are both 'contributing maximas' ... - if (e1->WindDelta == 0 && e2->WindDelta == 0) return; - - //if intersecting a subj line with a subj poly ... - else if (e1->PolyTyp == e2->PolyTyp && - e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion) - { - if (e1->WindDelta == 0) - { - if (e2Contributing) - { - AddOutPt(e1, Pt); - if (e1Contributing) e1->OutIdx = Unassigned; - } - } - else - { - if (e1Contributing) - { - AddOutPt(e2, Pt); - if (e2Contributing) e2->OutIdx = Unassigned; - } - } - } - else if (e1->PolyTyp != e2->PolyTyp) - { - //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ... - if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 && - (m_ClipType != ctUnion || e2->WindCnt2 == 0)) - { - AddOutPt(e1, Pt); - if (e1Contributing) e1->OutIdx = Unassigned; - } - else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) && - (m_ClipType != ctUnion || e1->WindCnt2 == 0)) - { - AddOutPt(e2, Pt); - if (e2Contributing) e2->OutIdx = Unassigned; - } - } - return; - } -#endif - - //update winding counts... - //assumes that e1 will be to the Right of e2 ABOVE the intersection - if ( e1->PolyTyp == e2->PolyTyp ) - { - if ( IsEvenOddFillType( *e1) ) - { - int oldE1WindCnt = e1->WindCnt; - e1->WindCnt = e2->WindCnt; - e2->WindCnt = oldE1WindCnt; - } else - { - if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt; - else e1->WindCnt += e2->WindDelta; - if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt; - else e2->WindCnt -= e1->WindDelta; - } - } else - { - if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta; - else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0; - if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta; - else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0; - } - - PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; - if (e1->PolyTyp == ptSubject) - { - e1FillType = m_SubjFillType; - e1FillType2 = m_ClipFillType; - } else - { - e1FillType = m_ClipFillType; - e1FillType2 = m_SubjFillType; - } - if (e2->PolyTyp == ptSubject) - { - e2FillType = m_SubjFillType; - e2FillType2 = m_ClipFillType; - } else - { - e2FillType = m_ClipFillType; - e2FillType2 = m_SubjFillType; - } - - cInt e1Wc, e2Wc; - switch (e1FillType) - { - case pftPositive: e1Wc = e1->WindCnt; break; - case pftNegative: e1Wc = -e1->WindCnt; break; - default: e1Wc = Abs(e1->WindCnt); - } - switch(e2FillType) - { - case pftPositive: e2Wc = e2->WindCnt; break; - case pftNegative: e2Wc = -e2->WindCnt; break; - default: e2Wc = Abs(e2->WindCnt); - } - - if ( e1Contributing && e2Contributing ) - { - if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || - (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) ) - { - AddLocalMaxPoly(e1, e2, Pt); - } - else - { - AddOutPt(e1, Pt); - AddOutPt(e2, Pt); - SwapSides( *e1 , *e2 ); - SwapPolyIndexes( *e1 , *e2 ); - } - } - else if ( e1Contributing ) - { - if (e2Wc == 0 || e2Wc == 1) - { - AddOutPt(e1, Pt); - SwapSides(*e1, *e2); - SwapPolyIndexes(*e1, *e2); - } - } - else if ( e2Contributing ) - { - if (e1Wc == 0 || e1Wc == 1) - { - AddOutPt(e2, Pt); - SwapSides(*e1, *e2); - SwapPolyIndexes(*e1, *e2); - } - } - else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) - { - //neither edge is currently contributing ... - - cInt e1Wc2, e2Wc2; - switch (e1FillType2) - { - case pftPositive: e1Wc2 = e1->WindCnt2; break; - case pftNegative : e1Wc2 = -e1->WindCnt2; break; - default: e1Wc2 = Abs(e1->WindCnt2); - } - switch (e2FillType2) - { - case pftPositive: e2Wc2 = e2->WindCnt2; break; - case pftNegative: e2Wc2 = -e2->WindCnt2; break; - default: e2Wc2 = Abs(e2->WindCnt2); - } - - if (e1->PolyTyp != e2->PolyTyp) - { - AddLocalMinPoly(e1, e2, Pt); - } - else if (e1Wc == 1 && e2Wc == 1) - switch( m_ClipType ) { - case ctIntersection: - if (e1Wc2 > 0 && e2Wc2 > 0) - AddLocalMinPoly(e1, e2, Pt); - break; - case ctUnion: - if ( e1Wc2 <= 0 && e2Wc2 <= 0 ) - AddLocalMinPoly(e1, e2, Pt); - break; - case ctDifference: - if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || - ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) - AddLocalMinPoly(e1, e2, Pt); - break; - case ctXor: - AddLocalMinPoly(e1, e2, Pt); - } - else - SwapSides( *e1, *e2 ); - } -} -//------------------------------------------------------------------------------ - -void Clipper::SetHoleState(TEdge *e, OutRec *outrec) -{ - TEdge *e2 = e->PrevInAEL; - TEdge *eTmp = 0; - while (e2) - { - if (e2->OutIdx >= 0 && e2->WindDelta != 0) - { - if (!eTmp) eTmp = e2; - else if (eTmp->OutIdx == e2->OutIdx) eTmp = 0; - } - e2 = e2->PrevInAEL; - } - if (!eTmp) - { - outrec->FirstLeft = 0; - outrec->IsHole = false; - } - else - { - outrec->FirstLeft = m_PolyOuts[eTmp->OutIdx]; - outrec->IsHole = !outrec->FirstLeft->IsHole; - } -} -//------------------------------------------------------------------------------ - -OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2) -{ - //work out which polygon fragment has the correct hole state ... - if (!outRec1->BottomPt) - outRec1->BottomPt = GetBottomPt(outRec1->Pts); - if (!outRec2->BottomPt) - outRec2->BottomPt = GetBottomPt(outRec2->Pts); - OutPt *OutPt1 = outRec1->BottomPt; - OutPt *OutPt2 = outRec2->BottomPt; - if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1; - else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2; - else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1; - else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2; - else if (OutPt1->Next == OutPt1) return outRec2; - else if (OutPt2->Next == OutPt2) return outRec1; - else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1; - else return outRec2; -} -//------------------------------------------------------------------------------ - -bool OutRec1RightOfOutRec2(OutRec* outRec1, OutRec* outRec2) -{ - do - { - outRec1 = outRec1->FirstLeft; - if (outRec1 == outRec2) return true; - } while (outRec1); - return false; -} -//------------------------------------------------------------------------------ - -OutRec* Clipper::GetOutRec(int Idx) -{ - OutRec* outrec = m_PolyOuts[Idx]; - while (outrec != m_PolyOuts[outrec->Idx]) - outrec = m_PolyOuts[outrec->Idx]; - return outrec; -} -//------------------------------------------------------------------------------ - -void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) -{ - //get the start and ends of both output polygons ... - OutRec *outRec1 = m_PolyOuts[e1->OutIdx]; - OutRec *outRec2 = m_PolyOuts[e2->OutIdx]; - - OutRec *holeStateRec; - if (OutRec1RightOfOutRec2(outRec1, outRec2)) - holeStateRec = outRec2; - else if (OutRec1RightOfOutRec2(outRec2, outRec1)) - holeStateRec = outRec1; - else - holeStateRec = GetLowermostRec(outRec1, outRec2); - - //get the start and ends of both output polygons and - //join e2 poly onto e1 poly and delete pointers to e2 ... - - OutPt* p1_lft = outRec1->Pts; - OutPt* p1_rt = p1_lft->Prev; - OutPt* p2_lft = outRec2->Pts; - OutPt* p2_rt = p2_lft->Prev; - - //join e2 poly onto e1 poly and delete pointers to e2 ... - if( e1->Side == esLeft ) - { - if( e2->Side == esLeft ) - { - //z y x a b c - ReversePolyPtLinks(p2_lft); - p2_lft->Next = p1_lft; - p1_lft->Prev = p2_lft; - p1_rt->Next = p2_rt; - p2_rt->Prev = p1_rt; - outRec1->Pts = p2_rt; - } else - { - //x y z a b c - p2_rt->Next = p1_lft; - p1_lft->Prev = p2_rt; - p2_lft->Prev = p1_rt; - p1_rt->Next = p2_lft; - outRec1->Pts = p2_lft; - } - } else - { - if( e2->Side == esRight ) - { - //a b c z y x - ReversePolyPtLinks(p2_lft); - p1_rt->Next = p2_rt; - p2_rt->Prev = p1_rt; - p2_lft->Next = p1_lft; - p1_lft->Prev = p2_lft; - } else - { - //a b c x y z - p1_rt->Next = p2_lft; - p2_lft->Prev = p1_rt; - p1_lft->Prev = p2_rt; - p2_rt->Next = p1_lft; - } - } - - outRec1->BottomPt = 0; - if (holeStateRec == outRec2) - { - if (outRec2->FirstLeft != outRec1) - outRec1->FirstLeft = outRec2->FirstLeft; - outRec1->IsHole = outRec2->IsHole; - } - outRec2->Pts = 0; - outRec2->BottomPt = 0; - outRec2->FirstLeft = outRec1; - - int OKIdx = e1->OutIdx; - int ObsoleteIdx = e2->OutIdx; - - e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly - e2->OutIdx = Unassigned; - - TEdge* e = m_ActiveEdges; - while( e ) - { - if( e->OutIdx == ObsoleteIdx ) - { - e->OutIdx = OKIdx; - e->Side = e1->Side; - break; - } - e = e->NextInAEL; - } - - outRec2->Idx = outRec1->Idx; -} -//------------------------------------------------------------------------------ - -OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt) -{ - if( e->OutIdx < 0 ) - { - OutRec *outRec = CreateOutRec(); - outRec->IsOpen = (e->WindDelta == 0); - OutPt* newOp = new OutPt; - outRec->Pts = newOp; - newOp->Idx = outRec->Idx; - newOp->Pt = pt; - newOp->Next = newOp; - newOp->Prev = newOp; - if (!outRec->IsOpen) - SetHoleState(e, outRec); - e->OutIdx = outRec->Idx; - return newOp; - } else - { - OutRec *outRec = m_PolyOuts[e->OutIdx]; - //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' - OutPt* op = outRec->Pts; - - bool ToFront = (e->Side == esLeft); - if (ToFront && (pt == op->Pt)) return op; - else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev; - - OutPt* newOp = new OutPt; - newOp->Idx = outRec->Idx; - newOp->Pt = pt; - newOp->Next = op; - newOp->Prev = op->Prev; - newOp->Prev->Next = newOp; - op->Prev = newOp; - if (ToFront) outRec->Pts = newOp; - return newOp; - } -} -//------------------------------------------------------------------------------ - -OutPt* Clipper::GetLastOutPt(TEdge *e) -{ - OutRec *outRec = m_PolyOuts[e->OutIdx]; - if (e->Side == esLeft) - return outRec->Pts; - else - return outRec->Pts->Prev; -} -//------------------------------------------------------------------------------ - -void Clipper::ProcessHorizontals() -{ - TEdge* horzEdge; - while (PopEdgeFromSEL(horzEdge)) - ProcessHorizontal(horzEdge); -} -//------------------------------------------------------------------------------ - -inline bool IsMinima(TEdge *e) -{ - return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e); -} -//------------------------------------------------------------------------------ - -inline bool IsMaxima(TEdge *e, const cInt Y) -{ - return e && e->Top.Y == Y && !e->NextInLML; -} -//------------------------------------------------------------------------------ - -inline bool IsIntermediate(TEdge *e, const cInt Y) -{ - return e->Top.Y == Y && e->NextInLML; -} -//------------------------------------------------------------------------------ - -TEdge *GetMaximaPair(TEdge *e) -{ - if ((e->Next->Top == e->Top) && !e->Next->NextInLML) - return e->Next; - else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML) - return e->Prev; - else return 0; -} -//------------------------------------------------------------------------------ - -TEdge *GetMaximaPairEx(TEdge *e) -{ - //as GetMaximaPair() but returns 0 if MaxPair isn't in AEL (unless it's horizontal) - TEdge* result = GetMaximaPair(e); - if (result && (result->OutIdx == Skip || - (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result)))) return 0; - return result; -} -//------------------------------------------------------------------------------ - -void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2) -{ - if( !( Edge1->NextInSEL ) && !( Edge1->PrevInSEL ) ) return; - if( !( Edge2->NextInSEL ) && !( Edge2->PrevInSEL ) ) return; - - if( Edge1->NextInSEL == Edge2 ) - { - TEdge* Next = Edge2->NextInSEL; - if( Next ) Next->PrevInSEL = Edge1; - TEdge* Prev = Edge1->PrevInSEL; - if( Prev ) Prev->NextInSEL = Edge2; - Edge2->PrevInSEL = Prev; - Edge2->NextInSEL = Edge1; - Edge1->PrevInSEL = Edge2; - Edge1->NextInSEL = Next; - } - else if( Edge2->NextInSEL == Edge1 ) - { - TEdge* Next = Edge1->NextInSEL; - if( Next ) Next->PrevInSEL = Edge2; - TEdge* Prev = Edge2->PrevInSEL; - if( Prev ) Prev->NextInSEL = Edge1; - Edge1->PrevInSEL = Prev; - Edge1->NextInSEL = Edge2; - Edge2->PrevInSEL = Edge1; - Edge2->NextInSEL = Next; - } - else - { - TEdge* Next = Edge1->NextInSEL; - TEdge* Prev = Edge1->PrevInSEL; - Edge1->NextInSEL = Edge2->NextInSEL; - if( Edge1->NextInSEL ) Edge1->NextInSEL->PrevInSEL = Edge1; - Edge1->PrevInSEL = Edge2->PrevInSEL; - if( Edge1->PrevInSEL ) Edge1->PrevInSEL->NextInSEL = Edge1; - Edge2->NextInSEL = Next; - if( Edge2->NextInSEL ) Edge2->NextInSEL->PrevInSEL = Edge2; - Edge2->PrevInSEL = Prev; - if( Edge2->PrevInSEL ) Edge2->PrevInSEL->NextInSEL = Edge2; - } - - if( !Edge1->PrevInSEL ) m_SortedEdges = Edge1; - else if( !Edge2->PrevInSEL ) m_SortedEdges = Edge2; -} -//------------------------------------------------------------------------------ - -TEdge* GetNextInAEL(TEdge *e, Direction dir) -{ - return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL; -} -//------------------------------------------------------------------------------ - -void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right) -{ - if (HorzEdge.Bot.X < HorzEdge.Top.X) - { - Left = HorzEdge.Bot.X; - Right = HorzEdge.Top.X; - Dir = dLeftToRight; - } else - { - Left = HorzEdge.Top.X; - Right = HorzEdge.Bot.X; - Dir = dRightToLeft; - } -} -//------------------------------------------------------------------------ - -/******************************************************************************* -* Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or * -* Bottom of a scanbeam) are processed as if layered. The order in which HEs * -* are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] * -* (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), * -* and with other non-horizontal edges [*]. Once these intersections are * -* processed, intermediate HEs then 'promote' the Edge above (NextInLML) into * -* the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. * -*******************************************************************************/ - -void Clipper::ProcessHorizontal(TEdge *horzEdge) -{ - Direction dir; - cInt horzLeft, horzRight; - bool IsOpen = (horzEdge->WindDelta == 0); - - GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); - - TEdge* eLastHorz = horzEdge, *eMaxPair = 0; - while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML)) - eLastHorz = eLastHorz->NextInLML; - if (!eLastHorz->NextInLML) - eMaxPair = GetMaximaPair(eLastHorz); - - MaximaList::const_iterator maxIt; - MaximaList::const_reverse_iterator maxRit; - if (m_Maxima.size() > 0) - { - //get the first maxima in range (X) ... - if (dir == dLeftToRight) - { - maxIt = m_Maxima.begin(); - while (maxIt != m_Maxima.end() && *maxIt <= horzEdge->Bot.X) maxIt++; - if (maxIt != m_Maxima.end() && *maxIt >= eLastHorz->Top.X) - maxIt = m_Maxima.end(); - } - else - { - maxRit = m_Maxima.rbegin(); - while (maxRit != m_Maxima.rend() && *maxRit > horzEdge->Bot.X) maxRit++; - if (maxRit != m_Maxima.rend() && *maxRit <= eLastHorz->Top.X) - maxRit = m_Maxima.rend(); - } - } - - OutPt* op1 = 0; - - for (;;) //loop through consec. horizontal edges - { - - bool IsLastHorz = (horzEdge == eLastHorz); - TEdge* e = GetNextInAEL(horzEdge, dir); - while(e) - { - - //this code block inserts extra coords into horizontal edges (in output - //polygons) whereever maxima touch these horizontal edges. This helps - //'simplifying' polygons (ie if the Simplify property is set). - if (m_Maxima.size() > 0) - { - if (dir == dLeftToRight) - { - while (maxIt != m_Maxima.end() && *maxIt < e->Curr.X) - { - if (horzEdge->OutIdx >= 0 && !IsOpen) - AddOutPt(horzEdge, IntPoint(*maxIt, horzEdge->Bot.Y)); - maxIt++; - } - } - else - { - while (maxRit != m_Maxima.rend() && *maxRit > e->Curr.X) - { - if (horzEdge->OutIdx >= 0 && !IsOpen) - AddOutPt(horzEdge, IntPoint(*maxRit, horzEdge->Bot.Y)); - maxRit++; - } - } - }; - - if ((dir == dLeftToRight && e->Curr.X > horzRight) || - (dir == dRightToLeft && e->Curr.X < horzLeft)) break; - - //Also break if we've got to the end of an intermediate horizontal edge ... - //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. - if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML && - e->Dx < horzEdge->NextInLML->Dx) break; - - if (horzEdge->OutIdx >= 0 && !IsOpen) //note: may be done multiple times - { -#ifdef use_xyz - if (dir == dLeftToRight) SetZ(e->Curr, *horzEdge, *e); - else SetZ(e->Curr, *e, *horzEdge); -#endif - op1 = AddOutPt(horzEdge, e->Curr); - TEdge* eNextHorz = m_SortedEdges; - while (eNextHorz) - { - if (eNextHorz->OutIdx >= 0 && - HorzSegmentsOverlap(horzEdge->Bot.X, - horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) - { - OutPt* op2 = GetLastOutPt(eNextHorz); - AddJoin(op2, op1, eNextHorz->Top); - } - eNextHorz = eNextHorz->NextInSEL; - } - AddGhostJoin(op1, horzEdge->Bot); - } - - //OK, so far we're still in range of the horizontal Edge but make sure - //we're at the last of consec. horizontals when matching with eMaxPair - if(e == eMaxPair && IsLastHorz) - { - if (horzEdge->OutIdx >= 0) - AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top); - DeleteFromAEL(horzEdge); - DeleteFromAEL(eMaxPair); - return; - } - - if(dir == dLeftToRight) - { - IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); - IntersectEdges(horzEdge, e, Pt); - } - else - { - IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); - IntersectEdges( e, horzEdge, Pt); - } - TEdge* eNext = GetNextInAEL(e, dir); - SwapPositionsInAEL( horzEdge, e ); - e = eNext; - } //end while(e) - - //Break out of loop if HorzEdge.NextInLML is not also horizontal ... - if (!horzEdge->NextInLML || !IsHorizontal(*horzEdge->NextInLML)) break; - - UpdateEdgeIntoAEL(horzEdge); - if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot); - GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); - - } //end for (;;) - - if (horzEdge->OutIdx >= 0 && !op1) - { - op1 = GetLastOutPt(horzEdge); - TEdge* eNextHorz = m_SortedEdges; - while (eNextHorz) - { - if (eNextHorz->OutIdx >= 0 && - HorzSegmentsOverlap(horzEdge->Bot.X, - horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) - { - OutPt* op2 = GetLastOutPt(eNextHorz); - AddJoin(op2, op1, eNextHorz->Top); - } - eNextHorz = eNextHorz->NextInSEL; - } - AddGhostJoin(op1, horzEdge->Top); - } - - if (horzEdge->NextInLML) - { - if(horzEdge->OutIdx >= 0) - { - op1 = AddOutPt( horzEdge, horzEdge->Top); - UpdateEdgeIntoAEL(horzEdge); - if (horzEdge->WindDelta == 0) return; - //nb: HorzEdge is no longer horizontal here - TEdge* ePrev = horzEdge->PrevInAEL; - TEdge* eNext = horzEdge->NextInAEL; - if (ePrev && ePrev->Curr.X == horzEdge->Bot.X && - ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 && - (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && - SlopesEqual(*horzEdge, *ePrev, m_UseFullRange))) - { - OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot); - AddJoin(op1, op2, horzEdge->Top); - } - else if (eNext && eNext->Curr.X == horzEdge->Bot.X && - eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 && - eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && - SlopesEqual(*horzEdge, *eNext, m_UseFullRange)) - { - OutPt* op2 = AddOutPt(eNext, horzEdge->Bot); - AddJoin(op1, op2, horzEdge->Top); - } - } - else - UpdateEdgeIntoAEL(horzEdge); - } - else - { - if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top); - DeleteFromAEL(horzEdge); - } -} -//------------------------------------------------------------------------------ - -bool Clipper::ProcessIntersections(const cInt topY) -{ - if( !m_ActiveEdges ) return true; - try { - BuildIntersectList(topY); - size_t IlSize = m_IntersectList.size(); - if (IlSize == 0) return true; - if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList(); - else return false; - } - catch(...) - { - m_SortedEdges = 0; - DisposeIntersectNodes(); - throw clipperException("ProcessIntersections error"); - } - m_SortedEdges = 0; - return true; -} -//------------------------------------------------------------------------------ - -void Clipper::DisposeIntersectNodes() -{ - for (size_t i = 0; i < m_IntersectList.size(); ++i ) - delete m_IntersectList[i]; - m_IntersectList.clear(); -} -//------------------------------------------------------------------------------ - -void Clipper::BuildIntersectList(const cInt topY) -{ - if ( !m_ActiveEdges ) return; - - //prepare for sorting ... - TEdge* e = m_ActiveEdges; - m_SortedEdges = e; - while( e ) - { - e->PrevInSEL = e->PrevInAEL; - e->NextInSEL = e->NextInAEL; - e->Curr.X = TopX( *e, topY ); - e = e->NextInAEL; - } - - //bubblesort ... - bool isModified; - do - { - isModified = false; - e = m_SortedEdges; - while( e->NextInSEL ) - { - TEdge *eNext = e->NextInSEL; - IntPoint Pt; - if(e->Curr.X > eNext->Curr.X) - { - IntersectPoint(*e, *eNext, Pt); - if (Pt.Y < topY) Pt = IntPoint(TopX(*e, topY), topY); - IntersectNode * newNode = new IntersectNode; - newNode->Edge1 = e; - newNode->Edge2 = eNext; - newNode->Pt = Pt; - m_IntersectList.push_back(newNode); - - SwapPositionsInSEL(e, eNext); - isModified = true; - } - else - e = eNext; - } - if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0; - else break; - } - while ( isModified ); - m_SortedEdges = 0; //important -} -//------------------------------------------------------------------------------ - - -void Clipper::ProcessIntersectList() -{ - for (size_t i = 0; i < m_IntersectList.size(); ++i) - { - IntersectNode* iNode = m_IntersectList[i]; - { - IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt); - SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 ); - } - delete iNode; - } - m_IntersectList.clear(); -} -//------------------------------------------------------------------------------ - -bool IntersectListSort(IntersectNode* node1, IntersectNode* node2) -{ - return node2->Pt.Y < node1->Pt.Y; -} -//------------------------------------------------------------------------------ - -inline bool EdgesAdjacent(const IntersectNode &inode) -{ - return (inode.Edge1->NextInSEL == inode.Edge2) || - (inode.Edge1->PrevInSEL == inode.Edge2); -} -//------------------------------------------------------------------------------ - -bool Clipper::FixupIntersectionOrder() -{ - //pre-condition: intersections are sorted Bottom-most first. - //Now it's crucial that intersections are made only between adjacent edges, - //so to ensure this the order of intersections may need adjusting ... - CopyAELToSEL(); - std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort); - size_t cnt = m_IntersectList.size(); - for (size_t i = 0; i < cnt; ++i) - { - if (!EdgesAdjacent(*m_IntersectList[i])) - { - size_t j = i + 1; - while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++; - if (j == cnt) return false; - std::swap(m_IntersectList[i], m_IntersectList[j]); - } - SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2); - } - return true; -} -//------------------------------------------------------------------------------ - -void Clipper::DoMaxima(TEdge *e) -{ - TEdge* eMaxPair = GetMaximaPairEx(e); - if (!eMaxPair) - { - if (e->OutIdx >= 0) - AddOutPt(e, e->Top); - DeleteFromAEL(e); - return; - } - - TEdge* eNext = e->NextInAEL; - while(eNext && eNext != eMaxPair) - { - IntersectEdges(e, eNext, e->Top); - SwapPositionsInAEL(e, eNext); - eNext = e->NextInAEL; - } - - if(e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned) - { - DeleteFromAEL(e); - DeleteFromAEL(eMaxPair); - } - else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 ) - { - if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top); - DeleteFromAEL(e); - DeleteFromAEL(eMaxPair); - } -#ifdef use_lines - else if (e->WindDelta == 0) - { - if (e->OutIdx >= 0) - { - AddOutPt(e, e->Top); - e->OutIdx = Unassigned; - } - DeleteFromAEL(e); - - if (eMaxPair->OutIdx >= 0) - { - AddOutPt(eMaxPair, e->Top); - eMaxPair->OutIdx = Unassigned; - } - DeleteFromAEL(eMaxPair); - } -#endif - else throw clipperException("DoMaxima error"); -} -//------------------------------------------------------------------------------ - -void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) -{ - TEdge* e = m_ActiveEdges; - while( e ) - { - //1. process maxima, treating them as if they're 'bent' horizontal edges, - // but exclude maxima with horizontal edges. nb: e can't be a horizontal. - bool IsMaximaEdge = IsMaxima(e, topY); - - if(IsMaximaEdge) - { - TEdge* eMaxPair = GetMaximaPairEx(e); - IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair)); - } - - if(IsMaximaEdge) - { - if (m_StrictSimple) m_Maxima.push_back(e->Top.X); - TEdge* ePrev = e->PrevInAEL; - DoMaxima(e); - if( !ePrev ) e = m_ActiveEdges; - else e = ePrev->NextInAEL; - } - else - { - //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... - if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML)) - { - UpdateEdgeIntoAEL(e); - if (e->OutIdx >= 0) - AddOutPt(e, e->Bot); - AddEdgeToSEL(e); - } - else - { - e->Curr.X = TopX( *e, topY ); - e->Curr.Y = topY; -#ifdef use_xyz - e->Curr.Z = topY == e->Top.Y ? e->Top.Z : (topY == e->Bot.Y ? e->Bot.Z : 0); -#endif - } - - //When StrictlySimple and 'e' is being touched by another edge, then - //make sure both edges have a vertex here ... - if (m_StrictSimple) - { - TEdge* ePrev = e->PrevInAEL; - if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) && - (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0)) - { - IntPoint pt = e->Curr; -#ifdef use_xyz - SetZ(pt, *ePrev, *e); -#endif - OutPt* op = AddOutPt(ePrev, pt); - OutPt* op2 = AddOutPt(e, pt); - AddJoin(op, op2, pt); //StrictlySimple (type-3) join - } - } - - e = e->NextInAEL; - } - } - - //3. Process horizontals at the Top of the scanbeam ... - m_Maxima.sort(); - ProcessHorizontals(); - m_Maxima.clear(); - - //4. Promote intermediate vertices ... - e = m_ActiveEdges; - while(e) - { - if(IsIntermediate(e, topY)) - { - OutPt* op = 0; - if( e->OutIdx >= 0 ) - op = AddOutPt(e, e->Top); - UpdateEdgeIntoAEL(e); - - //if output polygons share an edge, they'll need joining later ... - TEdge* ePrev = e->PrevInAEL; - TEdge* eNext = e->NextInAEL; - if (ePrev && ePrev->Curr.X == e->Bot.X && - ePrev->Curr.Y == e->Bot.Y && op && - ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && - SlopesEqual(e->Curr, e->Top, ePrev->Curr, ePrev->Top, m_UseFullRange) && - (e->WindDelta != 0) && (ePrev->WindDelta != 0)) - { - OutPt* op2 = AddOutPt(ePrev, e->Bot); - AddJoin(op, op2, e->Top); - } - else if (eNext && eNext->Curr.X == e->Bot.X && - eNext->Curr.Y == e->Bot.Y && op && - eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && - SlopesEqual(e->Curr, e->Top, eNext->Curr, eNext->Top, m_UseFullRange) && - (e->WindDelta != 0) && (eNext->WindDelta != 0)) - { - OutPt* op2 = AddOutPt(eNext, e->Bot); - AddJoin(op, op2, e->Top); - } - } - e = e->NextInAEL; - } -} -//------------------------------------------------------------------------------ - -void Clipper::FixupOutPolyline(OutRec &outrec) -{ - OutPt *pp = outrec.Pts; - OutPt *lastPP = pp->Prev; - while (pp != lastPP) - { - pp = pp->Next; - if (pp->Pt == pp->Prev->Pt) - { - if (pp == lastPP) lastPP = pp->Prev; - OutPt *tmpPP = pp->Prev; - tmpPP->Next = pp->Next; - pp->Next->Prev = tmpPP; - delete pp; - pp = tmpPP; - } - } - - if (pp == pp->Prev) - { - DisposeOutPts(pp); - outrec.Pts = 0; - return; - } -} -//------------------------------------------------------------------------------ - -void Clipper::FixupOutPolygon(OutRec &outrec) -{ - //FixupOutPolygon() - removes duplicate points and simplifies consecutive - //parallel edges by removing the middle vertex. - OutPt *lastOK = 0; - outrec.BottomPt = 0; - OutPt *pp = outrec.Pts; - bool preserveCol = m_PreserveCollinear || m_StrictSimple; - - for (;;) - { - if (pp->Prev == pp || pp->Prev == pp->Next) - { - DisposeOutPts(pp); - outrec.Pts = 0; - return; - } - - //test for duplicate points and collinear edges ... - if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) || - (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) && - (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt)))) - { - lastOK = 0; - OutPt *tmp = pp; - pp->Prev->Next = pp->Next; - pp->Next->Prev = pp->Prev; - pp = pp->Prev; - delete tmp; - } - else if (pp == lastOK) break; - else - { - if (!lastOK) lastOK = pp; - pp = pp->Next; - } - } - outrec.Pts = pp; -} -//------------------------------------------------------------------------------ - -int PointCount(OutPt *Pts) -{ - if (!Pts) return 0; - int result = 0; - OutPt* p = Pts; - do - { - result++; - p = p->Next; - } - while (p != Pts); - return result; -} -//------------------------------------------------------------------------------ - -void Clipper::BuildResult(Paths &polys) -{ - polys.reserve(m_PolyOuts.size()); - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - if (!m_PolyOuts[i]->Pts) continue; - Path pg; - OutPt* p = m_PolyOuts[i]->Pts->Prev; - int cnt = PointCount(p); - if (cnt < 2) continue; - pg.reserve(cnt); - for (int i = 0; i < cnt; ++i) - { - pg.push_back(p->Pt); - p = p->Prev; - } - polys.push_back(pg); - } -} -//------------------------------------------------------------------------------ - -void Clipper::BuildResult2(PolyTree& polytree) -{ - polytree.Clear(); - polytree.AllNodes.reserve(m_PolyOuts.size()); - //add each output polygon/contour to polytree ... - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) - { - OutRec* outRec = m_PolyOuts[i]; - int cnt = PointCount(outRec->Pts); - if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) continue; - FixHoleLinkage(*outRec); - PolyNode* pn = new PolyNode(); - //nb: polytree takes ownership of all the PolyNodes - polytree.AllNodes.push_back(pn); - outRec->PolyNd = pn; - pn->Parent = 0; - pn->Index = 0; - pn->Contour.reserve(cnt); - OutPt *op = outRec->Pts->Prev; - for (int j = 0; j < cnt; j++) - { - pn->Contour.push_back(op->Pt); - op = op->Prev; - } - } - - //fixup PolyNode links etc ... - polytree.Childs.reserve(m_PolyOuts.size()); - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) - { - OutRec* outRec = m_PolyOuts[i]; - if (!outRec->PolyNd) continue; - if (outRec->IsOpen) - { - outRec->PolyNd->m_IsOpen = true; - polytree.AddChild(*outRec->PolyNd); - } - else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd) - outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd); - else - polytree.AddChild(*outRec->PolyNd); - } -} -//------------------------------------------------------------------------------ - -void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) -{ - //just swap the contents (because fIntersectNodes is a single-linked-list) - IntersectNode inode = int1; //gets a copy of Int1 - int1.Edge1 = int2.Edge1; - int1.Edge2 = int2.Edge2; - int1.Pt = int2.Pt; - int2.Edge1 = inode.Edge1; - int2.Edge2 = inode.Edge2; - int2.Pt = inode.Pt; -} -//------------------------------------------------------------------------------ - -inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) -{ - if (e2.Curr.X == e1.Curr.X) - { - if (e2.Top.Y > e1.Top.Y) - return e2.Top.X < TopX(e1, e2.Top.Y); - else return e1.Top.X > TopX(e2, e1.Top.Y); - } - else return e2.Curr.X < e1.Curr.X; -} -//------------------------------------------------------------------------------ - -bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2, - cInt& Left, cInt& Right) -{ - if (a1 < a2) - { - if (b1 < b2) {Left = std::max(a1,b1); Right = std::min(a2,b2);} - else {Left = std::max(a1,b2); Right = std::min(a2,b1);} - } - else - { - if (b1 < b2) {Left = std::max(a2,b1); Right = std::min(a1,b2);} - else {Left = std::max(a2,b2); Right = std::min(a1,b1);} - } - return Left < Right; -} -//------------------------------------------------------------------------------ - -inline void UpdateOutPtIdxs(OutRec& outrec) -{ - OutPt* op = outrec.Pts; - do - { - op->Idx = outrec.Idx; - op = op->Prev; - } - while(op != outrec.Pts); -} -//------------------------------------------------------------------------------ - -void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge) -{ - if(!m_ActiveEdges) - { - edge->PrevInAEL = 0; - edge->NextInAEL = 0; - m_ActiveEdges = edge; - } - else if(!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge)) - { - edge->PrevInAEL = 0; - edge->NextInAEL = m_ActiveEdges; - m_ActiveEdges->PrevInAEL = edge; - m_ActiveEdges = edge; - } - else - { - if(!startEdge) startEdge = m_ActiveEdges; - while(startEdge->NextInAEL && - !E2InsertsBeforeE1(*startEdge->NextInAEL , *edge)) - startEdge = startEdge->NextInAEL; - edge->NextInAEL = startEdge->NextInAEL; - if(startEdge->NextInAEL) startEdge->NextInAEL->PrevInAEL = edge; - edge->PrevInAEL = startEdge; - startEdge->NextInAEL = edge; - } -} -//---------------------------------------------------------------------- - -OutPt* DupOutPt(OutPt* outPt, bool InsertAfter) -{ - OutPt* result = new OutPt; - result->Pt = outPt->Pt; - result->Idx = outPt->Idx; - if (InsertAfter) - { - result->Next = outPt->Next; - result->Prev = outPt; - outPt->Next->Prev = result; - outPt->Next = result; - } - else - { - result->Prev = outPt->Prev; - result->Next = outPt; - outPt->Prev->Next = result; - outPt->Prev = result; - } - return result; -} -//------------------------------------------------------------------------------ - -bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b, - const IntPoint Pt, bool DiscardLeft) -{ - Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight); - Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight); - if (Dir1 == Dir2) return false; - - //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we - //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) - //So, to facilitate this while inserting Op1b and Op2b ... - //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, - //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) - if (Dir1 == dLeftToRight) - { - while (op1->Next->Pt.X <= Pt.X && - op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) - op1 = op1->Next; - if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; - op1b = DupOutPt(op1, !DiscardLeft); - if (op1b->Pt != Pt) - { - op1 = op1b; - op1->Pt = Pt; - op1b = DupOutPt(op1, !DiscardLeft); - } - } - else - { - while (op1->Next->Pt.X >= Pt.X && - op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) - op1 = op1->Next; - if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; - op1b = DupOutPt(op1, DiscardLeft); - if (op1b->Pt != Pt) - { - op1 = op1b; - op1->Pt = Pt; - op1b = DupOutPt(op1, DiscardLeft); - } - } - - if (Dir2 == dLeftToRight) - { - while (op2->Next->Pt.X <= Pt.X && - op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) - op2 = op2->Next; - if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; - op2b = DupOutPt(op2, !DiscardLeft); - if (op2b->Pt != Pt) - { - op2 = op2b; - op2->Pt = Pt; - op2b = DupOutPt(op2, !DiscardLeft); - }; - } else - { - while (op2->Next->Pt.X >= Pt.X && - op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) - op2 = op2->Next; - if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; - op2b = DupOutPt(op2, DiscardLeft); - if (op2b->Pt != Pt) - { - op2 = op2b; - op2->Pt = Pt; - op2b = DupOutPt(op2, DiscardLeft); - }; - }; - - if ((Dir1 == dLeftToRight) == DiscardLeft) - { - op1->Prev = op2; - op2->Next = op1; - op1b->Next = op2b; - op2b->Prev = op1b; - } - else - { - op1->Next = op2; - op2->Prev = op1; - op1b->Prev = op2b; - op2b->Next = op1b; - } - return true; -} -//------------------------------------------------------------------------------ - -bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) -{ - OutPt *op1 = j->OutPt1, *op1b; - OutPt *op2 = j->OutPt2, *op2b; - - //There are 3 kinds of joins for output polygons ... - //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere - //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). - //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same - //location at the Bottom of the overlapping segment (& Join.OffPt is above). - //3. StrictSimple joins where edges touch but are not collinear and where - //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. - bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y); - - if (isHorizontal && (j->OffPt == j->OutPt1->Pt) && - (j->OffPt == j->OutPt2->Pt)) - { - //Strictly Simple join ... - if (outRec1 != outRec2) return false; - op1b = j->OutPt1->Next; - while (op1b != op1 && (op1b->Pt == j->OffPt)) - op1b = op1b->Next; - bool reverse1 = (op1b->Pt.Y > j->OffPt.Y); - op2b = j->OutPt2->Next; - while (op2b != op2 && (op2b->Pt == j->OffPt)) - op2b = op2b->Next; - bool reverse2 = (op2b->Pt.Y > j->OffPt.Y); - if (reverse1 == reverse2) return false; - if (reverse1) - { - op1b = DupOutPt(op1, false); - op2b = DupOutPt(op2, true); - op1->Prev = op2; - op2->Next = op1; - op1b->Next = op2b; - op2b->Prev = op1b; - j->OutPt1 = op1; - j->OutPt2 = op1b; - return true; - } else - { - op1b = DupOutPt(op1, true); - op2b = DupOutPt(op2, false); - op1->Next = op2; - op2->Prev = op1; - op1b->Prev = op2b; - op2b->Next = op1b; - j->OutPt1 = op1; - j->OutPt2 = op1b; - return true; - } - } - else if (isHorizontal) - { - //treat horizontal joins differently to non-horizontal joins since with - //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt - //may be anywhere along the horizontal edge. - op1b = op1; - while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2) - op1 = op1->Prev; - while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2) - op1b = op1b->Next; - if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon' - - op2b = op2; - while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b) - op2 = op2->Prev; - while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1) - op2b = op2b->Next; - if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon' - - cInt Left, Right; - //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges - if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right)) - return false; - - //DiscardLeftSide: when overlapping edges are joined, a spike will created - //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up - //on the discard Side as either may still be needed for other joins ... - IntPoint Pt; - bool DiscardLeftSide; - if (op1->Pt.X >= Left && op1->Pt.X <= Right) - { - Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X); - } - else if (op2->Pt.X >= Left&& op2->Pt.X <= Right) - { - Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X); - } - else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right) - { - Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X; - } - else - { - Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X); - } - j->OutPt1 = op1; j->OutPt2 = op2; - return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); - } else - { - //nb: For non-horizontal joins ... - // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y - // 2. Jr.OutPt1.Pt > Jr.OffPt.Y - - //make sure the polygons are correctly oriented ... - op1b = op1->Next; - while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next; - bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) || - !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)); - if (Reverse1) - { - op1b = op1->Prev; - while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev; - if ((op1b->Pt.Y > op1->Pt.Y) || - !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false; - }; - op2b = op2->Next; - while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next; - bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) || - !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)); - if (Reverse2) - { - op2b = op2->Prev; - while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev; - if ((op2b->Pt.Y > op2->Pt.Y) || - !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false; - } - - if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || - ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; - - if (Reverse1) - { - op1b = DupOutPt(op1, false); - op2b = DupOutPt(op2, true); - op1->Prev = op2; - op2->Next = op1; - op1b->Next = op2b; - op2b->Prev = op1b; - j->OutPt1 = op1; - j->OutPt2 = op1b; - return true; - } else - { - op1b = DupOutPt(op1, true); - op2b = DupOutPt(op2, false); - op1->Next = op2; - op2->Prev = op1; - op1b->Prev = op2b; - op2b->Next = op1b; - j->OutPt1 = op1; - j->OutPt2 = op1b; - return true; - } - } -} -//---------------------------------------------------------------------- - -static OutRec* ParseFirstLeft(OutRec* FirstLeft) -{ - while (FirstLeft && !FirstLeft->Pts) - FirstLeft = FirstLeft->FirstLeft; - return FirstLeft; -} -//------------------------------------------------------------------------------ - -void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) -{ - //tests if NewOutRec contains the polygon before reassigning FirstLeft - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec* outRec = m_PolyOuts[i]; - OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); - if (outRec->Pts && firstLeft == OldOutRec) - { - if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts)) - outRec->FirstLeft = NewOutRec; - } - } -} -//---------------------------------------------------------------------- - -void Clipper::FixupFirstLefts2(OutRec* InnerOutRec, OutRec* OuterOutRec) -{ - //A polygon has split into two such that one is now the inner of the other. - //It's possible that these polygons now wrap around other polygons, so check - //every polygon that's also contained by OuterOutRec's FirstLeft container - //(including 0) to see if they've become inner to the new inner polygon ... - OutRec* orfl = OuterOutRec->FirstLeft; - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec* outRec = m_PolyOuts[i]; - - if (!outRec->Pts || outRec == OuterOutRec || outRec == InnerOutRec) - continue; - OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); - if (firstLeft != orfl && firstLeft != InnerOutRec && firstLeft != OuterOutRec) - continue; - if (Poly2ContainsPoly1(outRec->Pts, InnerOutRec->Pts)) - outRec->FirstLeft = InnerOutRec; - else if (Poly2ContainsPoly1(outRec->Pts, OuterOutRec->Pts)) - outRec->FirstLeft = OuterOutRec; - else if (outRec->FirstLeft == InnerOutRec || outRec->FirstLeft == OuterOutRec) - outRec->FirstLeft = orfl; - } -} -//---------------------------------------------------------------------- -void Clipper::FixupFirstLefts3(OutRec* OldOutRec, OutRec* NewOutRec) -{ - //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon - for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) - { - OutRec* outRec = m_PolyOuts[i]; - OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); - if (outRec->Pts && firstLeft == OldOutRec) - outRec->FirstLeft = NewOutRec; - } -} -//---------------------------------------------------------------------- - -void Clipper::JoinCommonEdges() -{ - for (JoinList::size_type i = 0; i < m_Joins.size(); i++) - { - Join* join = m_Joins[i]; - - OutRec *outRec1 = GetOutRec(join->OutPt1->Idx); - OutRec *outRec2 = GetOutRec(join->OutPt2->Idx); - - if (!outRec1->Pts || !outRec2->Pts) continue; - if (outRec1->IsOpen || outRec2->IsOpen) continue; - - //get the polygon fragment with the correct hole state (FirstLeft) - //before calling JoinPoints() ... - OutRec *holeStateRec; - if (outRec1 == outRec2) holeStateRec = outRec1; - else if (OutRec1RightOfOutRec2(outRec1, outRec2)) holeStateRec = outRec2; - else if (OutRec1RightOfOutRec2(outRec2, outRec1)) holeStateRec = outRec1; - else holeStateRec = GetLowermostRec(outRec1, outRec2); - - if (!JoinPoints(join, outRec1, outRec2)) continue; - - if (outRec1 == outRec2) - { - //instead of joining two polygons, we've just created a new one by - //splitting one polygon into two. - outRec1->Pts = join->OutPt1; - outRec1->BottomPt = 0; - outRec2 = CreateOutRec(); - outRec2->Pts = join->OutPt2; - - //update all OutRec2.Pts Idx's ... - UpdateOutPtIdxs(*outRec2); - - if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts)) - { - //outRec1 contains outRec2 ... - outRec2->IsHole = !outRec1->IsHole; - outRec2->FirstLeft = outRec1; - - if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); - - if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0)) - ReversePolyPtLinks(outRec2->Pts); - - } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts)) - { - //outRec2 contains outRec1 ... - outRec2->IsHole = outRec1->IsHole; - outRec1->IsHole = !outRec2->IsHole; - outRec2->FirstLeft = outRec1->FirstLeft; - outRec1->FirstLeft = outRec2; - - if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); - - if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0)) - ReversePolyPtLinks(outRec1->Pts); - } - else - { - //the 2 polygons are completely separate ... - outRec2->IsHole = outRec1->IsHole; - outRec2->FirstLeft = outRec1->FirstLeft; - - //fixup FirstLeft pointers that may need reassigning to OutRec2 - if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); - } - - } else - { - //joined 2 polygons together ... - - outRec2->Pts = 0; - outRec2->BottomPt = 0; - outRec2->Idx = outRec1->Idx; - - outRec1->IsHole = holeStateRec->IsHole; - if (holeStateRec == outRec2) - outRec1->FirstLeft = outRec2->FirstLeft; - outRec2->FirstLeft = outRec1; - - if (m_UsingPolyTree) FixupFirstLefts3(outRec2, outRec1); - } - } -} - -//------------------------------------------------------------------------------ -// ClipperOffset support functions ... -//------------------------------------------------------------------------------ - -DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) -{ - if(pt2.X == pt1.X && pt2.Y == pt1.Y) - return DoublePoint(0, 0); - - double Dx = (double)(pt2.X - pt1.X); - double dy = (double)(pt2.Y - pt1.Y); - double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy ); - Dx *= f; - dy *= f; - return DoublePoint(dy, -Dx); -} - -//------------------------------------------------------------------------------ -// ClipperOffset class -//------------------------------------------------------------------------------ - -ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) -{ - this->MiterLimit = miterLimit; - this->ArcTolerance = arcTolerance; - m_lowest.X = -1; -} -//------------------------------------------------------------------------------ - -ClipperOffset::~ClipperOffset() -{ - Clear(); -} -//------------------------------------------------------------------------------ - -void ClipperOffset::Clear() -{ - for (int i = 0; i < m_polyNodes.ChildCount(); ++i) - delete m_polyNodes.Childs[i]; - m_polyNodes.Childs.clear(); - m_lowest.X = -1; -} -//------------------------------------------------------------------------------ - -void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType) -{ - int highI = (int)path.size() - 1; - if (highI < 0) return; - PolyNode* newNode = new PolyNode(); - newNode->m_jointype = joinType; - newNode->m_endtype = endType; - - //strip duplicate points from path and also get index to the lowest point ... - if (endType == etClosedLine || endType == etClosedPolygon) - while (highI > 0 && path[0] == path[highI]) highI--; - newNode->Contour.reserve(highI + 1); - newNode->Contour.push_back(path[0]); - int j = 0, k = 0; - for (int i = 1; i <= highI; i++) - if (newNode->Contour[j] != path[i]) - { - j++; - newNode->Contour.push_back(path[i]); - if (path[i].Y > newNode->Contour[k].Y || - (path[i].Y == newNode->Contour[k].Y && - path[i].X < newNode->Contour[k].X)) k = j; - } - if (endType == etClosedPolygon && j < 2) - { - delete newNode; - return; - } - m_polyNodes.AddChild(*newNode); - - //if this path's lowest pt is lower than all the others then update m_lowest - if (endType != etClosedPolygon) return; - if (m_lowest.X < 0) - m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); - else - { - IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y]; - if (newNode->Contour[k].Y > ip.Y || - (newNode->Contour[k].Y == ip.Y && - newNode->Contour[k].X < ip.X)) - m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); - } -} -//------------------------------------------------------------------------------ - -void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType) -{ - for (Paths::size_type i = 0; i < paths.size(); ++i) - AddPath(paths[i], joinType, endType); -} -//------------------------------------------------------------------------------ - -void ClipperOffset::FixOrientations() -{ - //fixup orientations of all closed paths if the orientation of the - //closed path with the lowermost vertex is wrong ... - if (m_lowest.X >= 0 && - !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour)) - { - for (int i = 0; i < m_polyNodes.ChildCount(); ++i) - { - PolyNode& node = *m_polyNodes.Childs[i]; - if (node.m_endtype == etClosedPolygon || - (node.m_endtype == etClosedLine && Orientation(node.Contour))) - ReversePath(node.Contour); - } - } else - { - for (int i = 0; i < m_polyNodes.ChildCount(); ++i) - { - PolyNode& node = *m_polyNodes.Childs[i]; - if (node.m_endtype == etClosedLine && !Orientation(node.Contour)) - ReversePath(node.Contour); - } - } -} -//------------------------------------------------------------------------------ - -void ClipperOffset::Execute(Paths& solution, double delta) -{ - solution.clear(); - FixOrientations(); - DoOffset(delta); - - //now clean up 'corners' ... - Clipper clpr; - clpr.AddPaths(m_destPolys, ptSubject, true); - if (delta > 0) - { - clpr.Execute(ctUnion, solution, pftPositive, pftPositive); - } - else - { - IntRect r = clpr.GetBounds(); - Path outer(4); - outer[0] = IntPoint(r.left - 10, r.bottom + 10); - outer[1] = IntPoint(r.right + 10, r.bottom + 10); - outer[2] = IntPoint(r.right + 10, r.top - 10); - outer[3] = IntPoint(r.left - 10, r.top - 10); - - clpr.AddPath(outer, ptSubject, true); - clpr.ReverseSolution(true); - clpr.Execute(ctUnion, solution, pftNegative, pftNegative); - if (solution.size() > 0) solution.erase(solution.begin()); - } -} -//------------------------------------------------------------------------------ - -void ClipperOffset::Execute(PolyTree& solution, double delta) -{ - solution.Clear(); - FixOrientations(); - DoOffset(delta); - - //now clean up 'corners' ... - Clipper clpr; - clpr.AddPaths(m_destPolys, ptSubject, true); - if (delta > 0) - { - clpr.Execute(ctUnion, solution, pftPositive, pftPositive); - } - else - { - IntRect r = clpr.GetBounds(); - Path outer(4); - outer[0] = IntPoint(r.left - 10, r.bottom + 10); - outer[1] = IntPoint(r.right + 10, r.bottom + 10); - outer[2] = IntPoint(r.right + 10, r.top - 10); - outer[3] = IntPoint(r.left - 10, r.top - 10); - - clpr.AddPath(outer, ptSubject, true); - clpr.ReverseSolution(true); - clpr.Execute(ctUnion, solution, pftNegative, pftNegative); - //remove the outer PolyNode rectangle ... - if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) - { - PolyNode* outerNode = solution.Childs[0]; - solution.Childs.reserve(outerNode->ChildCount()); - solution.Childs[0] = outerNode->Childs[0]; - solution.Childs[0]->Parent = outerNode->Parent; - for (int i = 1; i < outerNode->ChildCount(); ++i) - solution.AddChild(*outerNode->Childs[i]); - } - else - solution.Clear(); - } -} -//------------------------------------------------------------------------------ - -void ClipperOffset::DoOffset(double delta) -{ - m_destPolys.clear(); - m_delta = delta; - - //if Zero offset, just copy any CLOSED polygons to m_p and return ... - if (NEAR_ZERO(delta)) - { - m_destPolys.reserve(m_polyNodes.ChildCount()); - for (int i = 0; i < m_polyNodes.ChildCount(); i++) - { - PolyNode& node = *m_polyNodes.Childs[i]; - if (node.m_endtype == etClosedPolygon) - m_destPolys.push_back(node.Contour); - } - return; - } - - //see offset_triginometry3.svg in the documentation folder ... - if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit); - else m_miterLim = 0.5; - - double y; - if (ArcTolerance <= 0.0) y = def_arc_tolerance; - else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance) - y = std::fabs(delta) * def_arc_tolerance; - else y = ArcTolerance; - //see offset_triginometry2.svg in the documentation folder ... - double steps = pi / std::acos(1 - y / std::fabs(delta)); - if (steps > std::fabs(delta) * pi) - steps = std::fabs(delta) * pi; //ie excessive precision check - m_sin = std::sin(two_pi / steps); - m_cos = std::cos(two_pi / steps); - m_StepsPerRad = steps / two_pi; - if (delta < 0.0) m_sin = -m_sin; - - m_destPolys.reserve(m_polyNodes.ChildCount() * 2); - for (int i = 0; i < m_polyNodes.ChildCount(); i++) - { - PolyNode& node = *m_polyNodes.Childs[i]; - m_srcPoly = node.Contour; - - int len = (int)m_srcPoly.size(); - if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon))) - continue; - - m_destPoly.clear(); - if (len == 1) - { - if (node.m_jointype == jtRound) - { - double X = 1.0, Y = 0.0; - for (cInt j = 1; j <= steps; j++) - { - m_destPoly.push_back(IntPoint( - Round(m_srcPoly[0].X + X * delta), - Round(m_srcPoly[0].Y + Y * delta))); - double X2 = X; - X = X * m_cos - m_sin * Y; - Y = X2 * m_sin + Y * m_cos; - } - } - else - { - double X = -1.0, Y = -1.0; - for (int j = 0; j < 4; ++j) - { - m_destPoly.push_back(IntPoint( - Round(m_srcPoly[0].X + X * delta), - Round(m_srcPoly[0].Y + Y * delta))); - if (X < 0) X = 1; - else if (Y < 0) Y = 1; - else X = -1; - } - } - m_destPolys.push_back(m_destPoly); - continue; - } - //build m_normals ... - m_normals.clear(); - m_normals.reserve(len); - for (int j = 0; j < len - 1; ++j) - m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); - if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon) - m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); - else - m_normals.push_back(DoublePoint(m_normals[len - 2])); - - if (node.m_endtype == etClosedPolygon) - { - int k = len - 1; - for (int j = 0; j < len; ++j) - OffsetPoint(j, k, node.m_jointype); - m_destPolys.push_back(m_destPoly); - } - else if (node.m_endtype == etClosedLine) - { - int k = len - 1; - for (int j = 0; j < len; ++j) - OffsetPoint(j, k, node.m_jointype); - m_destPolys.push_back(m_destPoly); - m_destPoly.clear(); - //re-build m_normals ... - DoublePoint n = m_normals[len -1]; - for (int j = len - 1; j > 0; j--) - m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); - m_normals[0] = DoublePoint(-n.X, -n.Y); - k = 0; - for (int j = len - 1; j >= 0; j--) - OffsetPoint(j, k, node.m_jointype); - m_destPolys.push_back(m_destPoly); - } - else - { - int k = 0; - for (int j = 1; j < len - 1; ++j) - OffsetPoint(j, k, node.m_jointype); - - IntPoint pt1; - if (node.m_endtype == etOpenButt) - { - int j = len - 1; - pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * - delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); - m_destPoly.push_back(pt1); - pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * - delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); - m_destPoly.push_back(pt1); - } - else - { - int j = len - 1; - k = len - 2; - m_sinA = 0; - m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y); - if (node.m_endtype == etOpenSquare) - DoSquare(j, k); - else - DoRound(j, k); - } - - //re-build m_normals ... - for (int j = len - 1; j > 0; j--) - m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); - m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y); - - k = len - 1; - for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype); - - if (node.m_endtype == etOpenButt) - { - pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), - (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); - m_destPoly.push_back(pt1); - pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), - (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); - m_destPoly.push_back(pt1); - } - else - { - k = 1; - m_sinA = 0; - if (node.m_endtype == etOpenSquare) - DoSquare(0, 1); - else - DoRound(0, 1); - } - m_destPolys.push_back(m_destPoly); - } - } -} -//------------------------------------------------------------------------------ - -void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype) -{ - //cross product ... - m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); - if (std::fabs(m_sinA * m_delta) < 1.0) - { - //dot product ... - double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y ); - if (cosA > 0) // angle => 0 degrees - { - m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); - return; - } - //else angle => 180 degrees - } - else if (m_sinA > 1.0) m_sinA = 1.0; - else if (m_sinA < -1.0) m_sinA = -1.0; - - if (m_sinA * m_delta < 0) - { - m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); - m_destPoly.push_back(m_srcPoly[j]); - m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); - } - else - switch (jointype) - { - case jtMiter: - { - double r = 1 + (m_normals[j].X * m_normals[k].X + - m_normals[j].Y * m_normals[k].Y); - if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); - break; - } - case jtSquare: DoSquare(j, k); break; - case jtRound: DoRound(j, k); break; - } - k = j; -} -//------------------------------------------------------------------------------ - -void ClipperOffset::DoSquare(int j, int k) -{ - double dx = std::tan(std::atan2(m_sinA, - m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); - m_destPoly.push_back(IntPoint( - Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), - Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); - m_destPoly.push_back(IntPoint( - Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), - Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); -} -//------------------------------------------------------------------------------ - -void ClipperOffset::DoMiter(int j, int k, double r) -{ - double q = m_delta / r; - m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), - Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); -} -//------------------------------------------------------------------------------ - -void ClipperOffset::DoRound(int j, int k) -{ - double a = std::atan2(m_sinA, - m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); - int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1); - - double X = m_normals[k].X, Y = m_normals[k].Y, X2; - for (int i = 0; i < steps; ++i) - { - m_destPoly.push_back(IntPoint( - Round(m_srcPoly[j].X + X * m_delta), - Round(m_srcPoly[j].Y + Y * m_delta))); - X2 = X; - X = X * m_cos - m_sin * Y; - Y = X2 * m_sin + Y * m_cos; - } - m_destPoly.push_back(IntPoint( - Round(m_srcPoly[j].X + m_normals[j].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); -} - -//------------------------------------------------------------------------------ -// Miscellaneous public functions -//------------------------------------------------------------------------------ - -void Clipper::DoSimplePolygons() -{ - PolyOutList::size_type i = 0; - while (i < m_PolyOuts.size()) - { - OutRec* outrec = m_PolyOuts[i++]; - OutPt* op = outrec->Pts; - if (!op || outrec->IsOpen) continue; - do //for each Pt in Polygon until duplicate found do ... - { - OutPt* op2 = op->Next; - while (op2 != outrec->Pts) - { - if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op) - { - //split the polygon into two ... - OutPt* op3 = op->Prev; - OutPt* op4 = op2->Prev; - op->Prev = op4; - op4->Next = op; - op2->Prev = op3; - op3->Next = op2; - - outrec->Pts = op; - OutRec* outrec2 = CreateOutRec(); - outrec2->Pts = op2; - UpdateOutPtIdxs(*outrec2); - if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts)) - { - //OutRec2 is contained by OutRec1 ... - outrec2->IsHole = !outrec->IsHole; - outrec2->FirstLeft = outrec; - if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); - } - else - if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts)) - { - //OutRec1 is contained by OutRec2 ... - outrec2->IsHole = outrec->IsHole; - outrec->IsHole = !outrec2->IsHole; - outrec2->FirstLeft = outrec->FirstLeft; - outrec->FirstLeft = outrec2; - if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); - } - else - { - //the 2 polygons are separate ... - outrec2->IsHole = outrec->IsHole; - outrec2->FirstLeft = outrec->FirstLeft; - if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); - } - op2 = op; //ie get ready for the Next iteration - } - op2 = op2->Next; - } - op = op->Next; - } - while (op != outrec->Pts); - } -} -//------------------------------------------------------------------------------ - -void ReversePath(Path& p) -{ - std::reverse(p.begin(), p.end()); -} -//------------------------------------------------------------------------------ - -void ReversePaths(Paths& p) -{ - for (Paths::size_type i = 0; i < p.size(); ++i) - ReversePath(p[i]); -} -//------------------------------------------------------------------------------ - -void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) -{ - Clipper c; - c.StrictlySimple(true); - c.AddPath(in_poly, ptSubject, true); - c.Execute(ctUnion, out_polys, fillType, fillType); -} -//------------------------------------------------------------------------------ - -void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) -{ - Clipper c; - c.StrictlySimple(true); - c.AddPaths(in_polys, ptSubject, true); - c.Execute(ctUnion, out_polys, fillType, fillType); -} -//------------------------------------------------------------------------------ - -void SimplifyPolygons(Paths &polys, PolyFillType fillType) -{ - SimplifyPolygons(polys, polys, fillType); -} -//------------------------------------------------------------------------------ - -inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2) -{ - double Dx = ((double)pt1.X - pt2.X); - double dy = ((double)pt1.Y - pt2.Y); - return (Dx*Dx + dy*dy); -} -//------------------------------------------------------------------------------ - -double DistanceFromLineSqrd( - const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2) -{ - //The equation of a line in general form (Ax + By + C = 0) - //given 2 points (x�,y�) & (x�,y�) is ... - //(y� - y�)x + (x� - x�)y + (y� - y�)x� - (x� - x�)y� = 0 - //A = (y� - y�); B = (x� - x�); C = (y� - y�)x� - (x� - x�)y� - //perpendicular distance of point (x�,y�) = (Ax� + By� + C)/Sqrt(A� + B�) - //see http://en.wikipedia.org/wiki/Perpendicular_distance - double A = double(ln1.Y - ln2.Y); - double B = double(ln2.X - ln1.X); - double C = A * ln1.X + B * ln1.Y; - C = A * pt.X + B * pt.Y - C; - return (C * C) / (A * A + B * B); -} -//--------------------------------------------------------------------------- - -bool SlopesNearCollinear(const IntPoint& pt1, - const IntPoint& pt2, const IntPoint& pt3, double distSqrd) -{ - //this function is more accurate when the point that's geometrically - //between the other 2 points is the one that's tested for distance. - //ie makes it more likely to pick up 'spikes' ... - if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y)) - { - if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) - return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; - else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) - return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; - else - return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; - } - else - { - if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) - return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; - else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) - return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; - else - return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; - } -} -//------------------------------------------------------------------------------ - -bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) -{ - double Dx = (double)pt1.X - pt2.X; - double dy = (double)pt1.Y - pt2.Y; - return ((Dx * Dx) + (dy * dy) <= distSqrd); -} -//------------------------------------------------------------------------------ - -OutPt* ExcludeOp(OutPt* op) -{ - OutPt* result = op->Prev; - result->Next = op->Next; - op->Next->Prev = result; - result->Idx = 0; - return result; -} -//------------------------------------------------------------------------------ - -void CleanPolygon(const Path& in_poly, Path& out_poly, double distance) -{ - //distance = proximity in units/pixels below which vertices - //will be stripped. Default ~= sqrt(2). - - size_t size = in_poly.size(); - - if (size == 0) - { - out_poly.clear(); - return; - } - - OutPt* outPts = new OutPt[size]; - for (size_t i = 0; i < size; ++i) - { - outPts[i].Pt = in_poly[i]; - outPts[i].Next = &outPts[(i + 1) % size]; - outPts[i].Next->Prev = &outPts[i]; - outPts[i].Idx = 0; - } - - double distSqrd = distance * distance; - OutPt* op = &outPts[0]; - while (op->Idx == 0 && op->Next != op->Prev) - { - if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) - { - op = ExcludeOp(op); - size--; - } - else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) - { - ExcludeOp(op->Next); - op = ExcludeOp(op); - size -= 2; - } - else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) - { - op = ExcludeOp(op); - size--; - } - else - { - op->Idx = 1; - op = op->Next; - } - } - - if (size < 3) size = 0; - out_poly.resize(size); - for (size_t i = 0; i < size; ++i) - { - out_poly[i] = op->Pt; - op = op->Next; - } - delete [] outPts; -} -//------------------------------------------------------------------------------ - -void CleanPolygon(Path& poly, double distance) -{ - CleanPolygon(poly, poly, distance); -} -//------------------------------------------------------------------------------ - -void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance) -{ - out_polys.resize(in_polys.size()); - for (Paths::size_type i = 0; i < in_polys.size(); ++i) - CleanPolygon(in_polys[i], out_polys[i], distance); -} -//------------------------------------------------------------------------------ - -void CleanPolygons(Paths& polys, double distance) -{ - CleanPolygons(polys, polys, distance); -} -//------------------------------------------------------------------------------ - -void Minkowski(const Path& poly, const Path& path, - Paths& solution, bool isSum, bool isClosed) -{ - int delta = (isClosed ? 1 : 0); - size_t polyCnt = poly.size(); - size_t pathCnt = path.size(); - Paths pp; - pp.reserve(pathCnt); - if (isSum) - for (size_t i = 0; i < pathCnt; ++i) - { - Path p; - p.reserve(polyCnt); - for (size_t j = 0; j < poly.size(); ++j) - p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y)); - pp.push_back(p); - } - else - for (size_t i = 0; i < pathCnt; ++i) - { - Path p; - p.reserve(polyCnt); - for (size_t j = 0; j < poly.size(); ++j) - p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y)); - pp.push_back(p); - } - - solution.clear(); - solution.reserve((pathCnt + delta) * (polyCnt + 1)); - for (size_t i = 0; i < pathCnt - 1 + delta; ++i) - for (size_t j = 0; j < polyCnt; ++j) - { - Path quad; - quad.reserve(4); - quad.push_back(pp[i % pathCnt][j % polyCnt]); - quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]); - quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]); - quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]); - if (!Orientation(quad)) ReversePath(quad); - solution.push_back(quad); - } -} -//------------------------------------------------------------------------------ - -void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed) -{ - Minkowski(pattern, path, solution, true, pathIsClosed); - Clipper c; - c.AddPaths(solution, ptSubject, true); - c.Execute(ctUnion, solution, pftNonZero, pftNonZero); -} -//------------------------------------------------------------------------------ - -void TranslatePath(const Path& input, Path& output, const IntPoint delta) -{ - //precondition: input != output - output.resize(input.size()); - for (size_t i = 0; i < input.size(); ++i) - output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y); -} -//------------------------------------------------------------------------------ - -void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed) -{ - Clipper c; - for (size_t i = 0; i < paths.size(); ++i) - { - Paths tmp; - Minkowski(pattern, paths[i], tmp, true, pathIsClosed); - c.AddPaths(tmp, ptSubject, true); - if (pathIsClosed) - { - Path tmp2; - TranslatePath(paths[i], tmp2, pattern[0]); - c.AddPath(tmp2, ptClip, true); - } - } - c.Execute(ctUnion, solution, pftNonZero, pftNonZero); -} -//------------------------------------------------------------------------------ - -void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution) -{ - Minkowski(poly1, poly2, solution, false, true); - Clipper c; - c.AddPaths(solution, ptSubject, true); - c.Execute(ctUnion, solution, pftNonZero, pftNonZero); -} -//------------------------------------------------------------------------------ - -enum NodeType {ntAny, ntOpen, ntClosed}; - -void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths) -{ - bool match = true; - if (nodetype == ntClosed) match = !polynode.IsOpen(); - else if (nodetype == ntOpen) return; - - if (!polynode.Contour.empty() && match) - paths.push_back(polynode.Contour); - for (int i = 0; i < polynode.ChildCount(); ++i) - AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths); -} -//------------------------------------------------------------------------------ - -void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) -{ - paths.resize(0); - paths.reserve(polytree.Total()); - AddPolyNodeToPaths(polytree, ntAny, paths); -} -//------------------------------------------------------------------------------ - -void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) -{ - paths.resize(0); - paths.reserve(polytree.Total()); - AddPolyNodeToPaths(polytree, ntClosed, paths); -} -//------------------------------------------------------------------------------ - -void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths) -{ - paths.resize(0); - paths.reserve(polytree.Total()); - //Open paths are top level only, so ... - for (int i = 0; i < polytree.ChildCount(); ++i) - if (polytree.Childs[i]->IsOpen()) - paths.push_back(polytree.Childs[i]->Contour); -} -//------------------------------------------------------------------------------ - -std::ostream& operator <<(std::ostream &s, const IntPoint &p) -{ - s << "(" << p.X << "," << p.Y << ")"; - return s; -} -//------------------------------------------------------------------------------ - -std::ostream& operator <<(std::ostream &s, const Path &p) -{ - if (p.empty()) return s; - Path::size_type last = p.size() -1; - for (Path::size_type i = 0; i < last; i++) - s << "(" << p[i].X << "," << p[i].Y << "), "; - s << "(" << p[last].X << "," << p[last].Y << ")\n"; - return s; -} -//------------------------------------------------------------------------------ - -std::ostream& operator <<(std::ostream &s, const Paths &p) -{ - for (Paths::size_type i = 0; i < p.size(); i++) - s << p[i]; - s << "\n"; - return s; -} -//------------------------------------------------------------------------------ - -} //ClipperLib namespace diff --git a/deploy/android_demo/app/src/main/cpp/ocr_clipper.hpp b/deploy/android_demo/app/src/main/cpp/ocr_clipper.hpp deleted file mode 100644 index 7129b535..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_clipper.hpp +++ /dev/null @@ -1,547 +0,0 @@ -/******************************************************************************* -* * -* Author : Angus Johnson * -* Version : 6.4.2 * -* Date : 27 February 2017 * -* Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2017 * -* * -* License: * -* Use, modification & distribution is subject to Boost Software License Ver 1. * -* http://www.boost.org/LICENSE_1_0.txt * -* * -* Attributions: * -* The code in this library is an extension of Bala Vatti's clipping algorithm: * -* "A generic solution to polygon clipping" * -* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * -* http://portal.acm.org/citation.cfm?id=129906 * -* * -* Computer graphics and geometric modeling: implementation and algorithms * -* By Max K. Agoston * -* Springer; 1 edition (January 4, 2005) * -* http://books.google.com/books?q=vatti+clipping+agoston * -* * -* See also: * -* "Polygon Offsetting by Computing Winding Numbers" * -* Paper no. DETC2005-85513 pp. 565-575 * -* ASME 2005 International Design Engineering Technical Conferences * -* and Computers and Information in Engineering Conference (IDETC/CIE2005) * -* September 24-28, 2005 , Long Beach, California, USA * -* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * -* * -*******************************************************************************/ - -#ifndef clipper_hpp -#define clipper_hpp - -#define CLIPPER_VERSION "6.4.2" - -//use_int32: When enabled 32bit ints are used instead of 64bit ints. This -//improve performance but coordinate values are limited to the range +/- 46340 -//#define use_int32 - -//use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance. -//#define use_xyz - -//use_lines: Enables line clipping. Adds a very minor cost to performance. -#define use_lines - -//use_deprecated: Enables temporary support for the obsolete functions -//#define use_deprecated - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ClipperLib { - -enum ClipType { - ctIntersection, ctUnion, ctDifference, ctXor -}; -enum PolyType { - ptSubject, ptClip -}; -//By far the most widely used winding rules for polygon filling are -//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) -//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) -//see http://glprogramming.com/red/chapter11.html -enum PolyFillType { - pftEvenOdd, pftNonZero, pftPositive, pftNegative -}; - -#ifdef use_int32 -typedef int cInt; -static cInt const loRange = 0x7FFF; -static cInt const hiRange = 0x7FFF; -#else -typedef signed long long cInt; -static cInt const loRange = 0x3FFFFFFF; -static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; -typedef signed long long long64; //used by Int128 class -typedef unsigned long long ulong64; - -#endif - -struct IntPoint { - cInt X; - cInt Y; -#ifdef use_xyz - cInt Z; - IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {}; -#else - - IntPoint(cInt x = 0, cInt y = 0) : X(x), Y(y) {}; -#endif - - friend inline bool operator==(const IntPoint &a, const IntPoint &b) { - return a.X == b.X && a.Y == b.Y; - } - - friend inline bool operator!=(const IntPoint &a, const IntPoint &b) { - return a.X != b.X || a.Y != b.Y; - } -}; -//------------------------------------------------------------------------------ - -typedef std::vector Path; -typedef std::vector Paths; - -inline Path &operator<<(Path &poly, const IntPoint &p) { - poly.push_back(p); - return poly; -} - -inline Paths &operator<<(Paths &polys, const Path &p) { - polys.push_back(p); - return polys; -} - -std::ostream &operator<<(std::ostream &s, const IntPoint &p); - -std::ostream &operator<<(std::ostream &s, const Path &p); - -std::ostream &operator<<(std::ostream &s, const Paths &p); - -struct DoublePoint { - double X; - double Y; - - DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {} - - DoublePoint(IntPoint ip) : X((double) ip.X), Y((double) ip.Y) {} -}; -//------------------------------------------------------------------------------ - -#ifdef use_xyz -typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt); -#endif - -enum InitOptions { - ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4 -}; -enum JoinType { - jtSquare, jtRound, jtMiter -}; -enum EndType { - etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound -}; - -class PolyNode; - -typedef std::vector PolyNodes; - -class PolyNode { -public: - PolyNode(); - - virtual ~PolyNode() {}; - Path Contour; - PolyNodes Childs; - PolyNode *Parent; - - PolyNode *GetNext() const; - - bool IsHole() const; - - bool IsOpen() const; - - int ChildCount() const; - -private: - //PolyNode& operator =(PolyNode& other); - unsigned Index; //node index in Parent.Childs - bool m_IsOpen; - JoinType m_jointype; - EndType m_endtype; - - PolyNode *GetNextSiblingUp() const; - - void AddChild(PolyNode &child); - - friend class Clipper; //to access Index - friend class ClipperOffset; -}; - -class PolyTree : public PolyNode { -public: - ~PolyTree() { Clear(); }; - - PolyNode *GetFirst() const; - - void Clear(); - - int Total() const; - -private: - //PolyTree& operator =(PolyTree& other); - PolyNodes AllNodes; - - friend class Clipper; //to access AllNodes -}; - -bool Orientation(const Path &poly); - -double Area(const Path &poly); - -int PointInPolygon(const IntPoint &pt, const Path &path); - -void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd); - -void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd); - -void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd); - -void CleanPolygon(const Path &in_poly, Path &out_poly, double distance = 1.415); - -void CleanPolygon(Path &poly, double distance = 1.415); - -void CleanPolygons(const Paths &in_polys, Paths &out_polys, double distance = 1.415); - -void CleanPolygons(Paths &polys, double distance = 1.415); - -void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed); - -void MinkowskiSum(const Path &pattern, const Paths &paths, Paths &solution, bool pathIsClosed); - -void MinkowskiDiff(const Path &poly1, const Path &poly2, Paths &solution); - -void PolyTreeToPaths(const PolyTree &polytree, Paths &paths); - -void ClosedPathsFromPolyTree(const PolyTree &polytree, Paths &paths); - -void OpenPathsFromPolyTree(PolyTree &polytree, Paths &paths); - -void ReversePath(Path &p); - -void ReversePaths(Paths &p); - -struct IntRect { - cInt left; - cInt top; - cInt right; - cInt bottom; -}; - -//enums that are used internally ... -enum EdgeSide { - esLeft = 1, esRight = 2 -}; - -//forward declarations (for stuff used internally) ... -struct TEdge; -struct IntersectNode; -struct LocalMinimum; -struct OutPt; -struct OutRec; -struct Join; - -typedef std::vector PolyOutList; -typedef std::vector EdgeList; -typedef std::vector JoinList; -typedef std::vector IntersectList; - -//------------------------------------------------------------------------------ - -//ClipperBase is the ancestor to the Clipper class. It should not be -//instantiated directly. This class simply abstracts the conversion of sets of -//polygon coordinates into edge objects that are stored in a LocalMinima list. -class ClipperBase { -public: - ClipperBase(); - - virtual ~ClipperBase(); - - virtual bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed); - - bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed); - - virtual void Clear(); - - IntRect GetBounds(); - - bool PreserveCollinear() { return m_PreserveCollinear; }; - - void PreserveCollinear(bool value) { m_PreserveCollinear = value; }; -protected: - void DisposeLocalMinimaList(); - - TEdge *AddBoundsToLML(TEdge *e, bool IsClosed); - - virtual void Reset(); - - TEdge *ProcessBound(TEdge *E, bool IsClockwise); - - void InsertScanbeam(const cInt Y); - - bool PopScanbeam(cInt &Y); - - bool LocalMinimaPending(); - - bool PopLocalMinima(cInt Y, const LocalMinimum *&locMin); - - OutRec *CreateOutRec(); - - void DisposeAllOutRecs(); - - void DisposeOutRec(PolyOutList::size_type index); - - void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); - - void DeleteFromAEL(TEdge *e); - - void UpdateEdgeIntoAEL(TEdge *&e); - - typedef std::vector MinimaList; - MinimaList::iterator m_CurrentLM; - MinimaList m_MinimaList; - - bool m_UseFullRange; - EdgeList m_edges; - bool m_PreserveCollinear; - bool m_HasOpenPaths; - PolyOutList m_PolyOuts; - TEdge *m_ActiveEdges; - - typedef std::priority_queue ScanbeamList; - ScanbeamList m_Scanbeam; -}; -//------------------------------------------------------------------------------ - -class Clipper : public virtual ClipperBase { -public: - Clipper(int initOptions = 0); - - bool Execute(ClipType clipType, - Paths &solution, - PolyFillType fillType = pftEvenOdd); - - bool Execute(ClipType clipType, - Paths &solution, - PolyFillType subjFillType, - PolyFillType clipFillType); - - bool Execute(ClipType clipType, - PolyTree &polytree, - PolyFillType fillType = pftEvenOdd); - - bool Execute(ClipType clipType, - PolyTree &polytree, - PolyFillType subjFillType, - PolyFillType clipFillType); - - bool ReverseSolution() { return m_ReverseOutput; }; - - void ReverseSolution(bool value) { m_ReverseOutput = value; }; - - bool StrictlySimple() { return m_StrictSimple; }; - - void StrictlySimple(bool value) { m_StrictSimple = value; }; - //set the callback function for z value filling on intersections (otherwise Z is 0) -#ifdef use_xyz - void ZFillFunction(ZFillCallback zFillFunc); -#endif -protected: - virtual bool ExecuteInternal(); - -private: - JoinList m_Joins; - JoinList m_GhostJoins; - IntersectList m_IntersectList; - ClipType m_ClipType; - typedef std::list MaximaList; - MaximaList m_Maxima; - TEdge *m_SortedEdges; - bool m_ExecuteLocked; - PolyFillType m_ClipFillType; - PolyFillType m_SubjFillType; - bool m_ReverseOutput; - bool m_UsingPolyTree; - bool m_StrictSimple; -#ifdef use_xyz - ZFillCallback m_ZFill; //custom callback -#endif - - void SetWindingCount(TEdge &edge); - - bool IsEvenOddFillType(const TEdge &edge) const; - - bool IsEvenOddAltFillType(const TEdge &edge) const; - - void InsertLocalMinimaIntoAEL(const cInt botY); - - void InsertEdgeIntoAEL(TEdge *edge, TEdge *startEdge); - - void AddEdgeToSEL(TEdge *edge); - - bool PopEdgeFromSEL(TEdge *&edge); - - void CopyAELToSEL(); - - void DeleteFromSEL(TEdge *e); - - void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2); - - bool IsContributing(const TEdge &edge) const; - - bool IsTopHorz(const cInt XPos); - - void DoMaxima(TEdge *e); - - void ProcessHorizontals(); - - void ProcessHorizontal(TEdge *horzEdge); - - void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); - - OutPt *AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); - - OutRec *GetOutRec(int idx); - - void AppendPolygon(TEdge *e1, TEdge *e2); - - void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt); - - OutPt *AddOutPt(TEdge *e, const IntPoint &pt); - - OutPt *GetLastOutPt(TEdge *e); - - bool ProcessIntersections(const cInt topY); - - void BuildIntersectList(const cInt topY); - - void ProcessIntersectList(); - - void ProcessEdgesAtTopOfScanbeam(const cInt topY); - - void BuildResult(Paths &polys); - - void BuildResult2(PolyTree &polytree); - - void SetHoleState(TEdge *e, OutRec *outrec); - - void DisposeIntersectNodes(); - - bool FixupIntersectionOrder(); - - void FixupOutPolygon(OutRec &outrec); - - void FixupOutPolyline(OutRec &outrec); - - bool IsHole(TEdge *e); - - bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl); - - void FixHoleLinkage(OutRec &outrec); - - void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt); - - void ClearJoins(); - - void ClearGhostJoins(); - - void AddGhostJoin(OutPt *op, const IntPoint offPt); - - bool JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2); - - void JoinCommonEdges(); - - void DoSimplePolygons(); - - void FixupFirstLefts1(OutRec *OldOutRec, OutRec *NewOutRec); - - void FixupFirstLefts2(OutRec *InnerOutRec, OutRec *OuterOutRec); - - void FixupFirstLefts3(OutRec *OldOutRec, OutRec *NewOutRec); - -#ifdef use_xyz - void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2); -#endif -}; -//------------------------------------------------------------------------------ - -class ClipperOffset { -public: - ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25); - - ~ClipperOffset(); - - void AddPath(const Path &path, JoinType joinType, EndType endType); - - void AddPaths(const Paths &paths, JoinType joinType, EndType endType); - - void Execute(Paths &solution, double delta); - - void Execute(PolyTree &solution, double delta); - - void Clear(); - - double MiterLimit; - double ArcTolerance; -private: - Paths m_destPolys; - Path m_srcPoly; - Path m_destPoly; - std::vector m_normals; - double m_delta, m_sinA, m_sin, m_cos; - double m_miterLim, m_StepsPerRad; - IntPoint m_lowest; - PolyNode m_polyNodes; - - void FixOrientations(); - - void DoOffset(double delta); - - void OffsetPoint(int j, int &k, JoinType jointype); - - void DoSquare(int j, int k); - - void DoMiter(int j, int k, double r); - - void DoRound(int j, int k); -}; -//------------------------------------------------------------------------------ - -class clipperException : public std::exception { -public: - clipperException(const char *description) : m_descr(description) {} - - virtual ~clipperException() throw() {} - - virtual const char *what() const throw() { return m_descr.c_str(); } - -private: - std::string m_descr; -}; -//------------------------------------------------------------------------------ - -} //ClipperLib namespace - -#endif //clipper_hpp - - diff --git a/deploy/android_demo/app/src/main/cpp/ocr_crnn_process.cpp b/deploy/android_demo/app/src/main/cpp/ocr_crnn_process.cpp deleted file mode 100644 index 96f37b9b..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_crnn_process.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "ocr_crnn_process.h" -#include -#include -#include -#include -#include -#include - -const std::string CHARACTER_TYPE = "ch"; -const int MAX_DICT_LENGTH = 6624; -const std::vector REC_IMAGE_SHAPE = {3, 32, 320}; - -static cv::Mat crnn_resize_norm_img(cv::Mat img, float wh_ratio) { - int imgC = REC_IMAGE_SHAPE[0]; - int imgW = REC_IMAGE_SHAPE[2]; - int imgH = REC_IMAGE_SHAPE[1]; - - if (CHARACTER_TYPE == "ch") - imgW = int(32 * wh_ratio); - - float ratio = float(img.cols) / float(img.rows); - int resize_w = 0; - if (ceilf(imgH * ratio) > imgW) - resize_w = imgW; - else - resize_w = int(ceilf(imgH * ratio)); - cv::Mat resize_img; - cv::resize(img, resize_img, cv::Size(resize_w, imgH), 0.f, 0.f, cv::INTER_CUBIC); - - resize_img.convertTo(resize_img, CV_32FC3, 1 / 255.f); - - for (int h = 0; h < resize_img.rows; h++) { - for (int w = 0; w < resize_img.cols; w++) { - resize_img.at(h, w)[0] = (resize_img.at(h, w)[0] - 0.5) * 2; - resize_img.at(h, w)[1] = (resize_img.at(h, w)[1] - 0.5) * 2; - resize_img.at(h, w)[2] = (resize_img.at(h, w)[2] - 0.5) * 2; - } - } - - cv::Mat dist; - cv::copyMakeBorder(resize_img, dist, 0, 0, 0, int(imgW - resize_w), cv::BORDER_CONSTANT, - {0, 0, 0}); - - return dist; - -} - -cv::Mat crnn_resize_img(const cv::Mat &img, float wh_ratio) { - int imgC = REC_IMAGE_SHAPE[0]; - int imgW = REC_IMAGE_SHAPE[2]; - int imgH = REC_IMAGE_SHAPE[1]; - - if (CHARACTER_TYPE == "ch") { - imgW = int(32 * wh_ratio); - } - - float ratio = float(img.cols) / float(img.rows); - int resize_w = 0; - if (ceilf(imgH * ratio) > imgW) - resize_w = imgW; - else - resize_w = int(ceilf(imgH * ratio)); - cv::Mat resize_img; - cv::resize(img, resize_img, cv::Size(resize_w, imgH)); - return resize_img; -} - - -cv::Mat get_rotate_crop_image(const cv::Mat &srcimage, const std::vector> &box) { - - std::vector> points = box; - - int x_collect[4] = {box[0][0], box[1][0], box[2][0], box[3][0]}; - int y_collect[4] = {box[0][1], box[1][1], box[2][1], box[3][1]}; - int left = int(*std::min_element(x_collect, x_collect + 4)); - int right = int(*std::max_element(x_collect, x_collect + 4)); - int top = int(*std::min_element(y_collect, y_collect + 4)); - int bottom = int(*std::max_element(y_collect, y_collect + 4)); - - cv::Mat img_crop; - srcimage(cv::Rect(left, top, right - left, bottom - top)).copyTo(img_crop); - - for (int i = 0; i < points.size(); i++) { - points[i][0] -= left; - points[i][1] -= top; - } - - int img_crop_width = int(sqrt(pow(points[0][0] - points[1][0], 2) + - pow(points[0][1] - points[1][1], 2))); - int img_crop_height = int(sqrt(pow(points[0][0] - points[3][0], 2) + - pow(points[0][1] - points[3][1], 2))); - - cv::Point2f pts_std[4]; - pts_std[0] = cv::Point2f(0., 0.); - pts_std[1] = cv::Point2f(img_crop_width, 0.); - pts_std[2] = cv::Point2f(img_crop_width, img_crop_height); - pts_std[3] = cv::Point2f(0.f, img_crop_height); - - cv::Point2f pointsf[4]; - pointsf[0] = cv::Point2f(points[0][0], points[0][1]); - pointsf[1] = cv::Point2f(points[1][0], points[1][1]); - pointsf[2] = cv::Point2f(points[2][0], points[2][1]); - pointsf[3] = cv::Point2f(points[3][0], points[3][1]); - - cv::Mat M = cv::getPerspectiveTransform(pointsf, pts_std); - - cv::Mat dst_img; - cv::warpPerspective(img_crop, dst_img, M, cv::Size(img_crop_width, img_crop_height), - cv::BORDER_REPLICATE); - - if (float(dst_img.rows) >= float(dst_img.cols) * 1.5) { - /* - cv::Mat srcCopy = cv::Mat(dst_img.rows, dst_img.cols, dst_img.depth()); - cv::transpose(dst_img, srcCopy); - cv::flip(srcCopy, srcCopy, 0); - return srcCopy; - */ - cv::transpose(dst_img, dst_img); - cv::flip(dst_img, dst_img, 0); - return dst_img; - } else { - return dst_img; - } - -} - diff --git a/deploy/android_demo/app/src/main/cpp/ocr_crnn_process.h b/deploy/android_demo/app/src/main/cpp/ocr_crnn_process.h deleted file mode 100644 index 99d0124a..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_crnn_process.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by fujiayi on 2020/7/3. -// -#pragma once - -#include -#include -#include "common.h" - -extern const std::vector REC_IMAGE_SHAPE; - -cv::Mat get_rotate_crop_image(const cv::Mat &srcimage, const std::vector> &box); - -cv::Mat crnn_resize_img(const cv::Mat &img, float wh_ratio); - -template -inline size_t argmax(ForwardIterator first, ForwardIterator last) { - return std::distance(first, std::max_element(first, last)); -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/ocr_db_post_process.cpp b/deploy/android_demo/app/src/main/cpp/ocr_db_post_process.cpp deleted file mode 100644 index 7c3c60db..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_db_post_process.cpp +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include -#include -#include -#include "opencv2/core.hpp" -#include "opencv2/imgcodecs.hpp" -#include "opencv2/imgproc.hpp" -#include "ocr_clipper.hpp" - -static void getcontourarea(float **box, float unclip_ratio, float &distance) { - int pts_num = 4; - float area = 0.0f; - float dist = 0.0f; - for (int i = 0; i < pts_num; i++) { - area += box[i][0] * box[(i + 1) % pts_num][1] - box[i][1] * box[(i + 1) % pts_num][0]; - dist += sqrtf( - (box[i][0] - box[(i + 1) % pts_num][0]) * (box[i][0] - box[(i + 1) % pts_num][0]) + - (box[i][1] - box[(i + 1) % pts_num][1]) * (box[i][1] - box[(i + 1) % pts_num][1])); - } - area = fabs(float(area / 2.0)); - - distance = area * unclip_ratio / dist; - -} - -static cv::RotatedRect unclip(float **box) { - float unclip_ratio = 2.0; - float distance = 1.0; - - getcontourarea(box, unclip_ratio, distance); - - ClipperLib::ClipperOffset offset; - ClipperLib::Path p; - p << ClipperLib::IntPoint(int(box[0][0]), int(box[0][1])) - << ClipperLib::IntPoint(int(box[1][0]), int(box[1][1])) << - ClipperLib::IntPoint(int(box[2][0]), int(box[2][1])) - << ClipperLib::IntPoint(int(box[3][0]), int(box[3][1])); - offset.AddPath(p, ClipperLib::jtRound, ClipperLib::etClosedPolygon); - - ClipperLib::Paths soln; - offset.Execute(soln, distance); - std::vector points; - - for (int j = 0; j < soln.size(); j++) { - for (int i = 0; i < soln[soln.size() - 1].size(); i++) { - points.emplace_back(soln[j][i].X, soln[j][i].Y); - } - } - cv::RotatedRect res = cv::minAreaRect(points); - - return res; -} - -static float **Mat2Vec(cv::Mat mat) { - auto **array = new float *[mat.rows]; - for (int i = 0; i < mat.rows; ++i){ - array[i] = new float[mat.cols]; - } - for (int i = 0; i < mat.rows; ++i) { - for (int j = 0; j < mat.cols; ++j) { - array[i][j] = mat.at(i, j); - } - } - - return array; -} - -static void quickSort(float **s, int l, int r) { - if (l < r) { - int i = l, j = r; - float x = s[l][0]; - float *xp = s[l]; - while (i < j) { - while (i < j && s[j][0] >= x){ - j--; - } - if (i < j){ - std::swap(s[i++], s[j]); - } - while (i < j && s[i][0] < x){ - i++; - } - if (i < j){ - std::swap(s[j--], s[i]); - } - } - s[i] = xp; - quickSort(s, l, i - 1); - quickSort(s, i + 1, r); - } -} - -static void quickSort_vector(std::vector> &box, int l, int r, int axis) { - if (l < r) { - int i = l, j = r; - int x = box[l][axis]; - std::vector xp(box[l]); - while (i < j) { - while (i < j && box[j][axis] >= x){ - j--; - } - if (i < j){ - std::swap(box[i++], box[j]); - } - while (i < j && box[i][axis] < x){ - i++; - } - if (i < j){ - std::swap(box[j--], box[i]); - } - } - box[i] = xp; - quickSort_vector(box, l, i - 1, axis); - quickSort_vector(box, i + 1, r, axis); - } -} - -static std::vector> order_points_clockwise(std::vector> pts) { - std::vector> box = pts; - quickSort_vector(box, 0, int(box.size() - 1), 0); - std::vector> leftmost = {box[0], box[1]}; - std::vector> rightmost = {box[2], box[3]}; - - if (leftmost[0][1] > leftmost[1][1]){ - std::swap(leftmost[0], leftmost[1]); - } - - if (rightmost[0][1] > rightmost[1][1]){ - std::swap(rightmost[0], rightmost[1]); - } - - std::vector> rect = {leftmost[0], rightmost[0], rightmost[1], leftmost[1]}; - return rect; -} - -static float **get_mini_boxes(cv::RotatedRect box, float &ssid) { - ssid = box.size.width >= box.size.height ? box.size.height : box.size.width; - - cv::Mat points; - cv::boxPoints(box, points); - // sorted box points - auto array = Mat2Vec(points); - quickSort(array, 0, 3); - - float *idx1 = array[0], *idx2 = array[1], *idx3 = array[2], *idx4 = array[3]; - if (array[3][1] <= array[2][1]) { - idx2 = array[3]; - idx3 = array[2]; - } else { - idx2 = array[2]; - idx3 = array[3]; - } - if (array[1][1] <= array[0][1]) { - idx1 = array[1]; - idx4 = array[0]; - } else { - idx1 = array[0]; - idx4 = array[1]; - } - - array[0] = idx1; - array[1] = idx2; - array[2] = idx3; - array[3] = idx4; - - return array; -} - -template T clamp(T x, T min, T max) { - if (x > max){ - return max; - } - if (x < min){ - return min; - } - return x; -} - -static float clampf(float x, float min, float max) { - if (x > max) - return max; - if (x < min) - return min; - return x; -} - - -float box_score_fast(float **box_array, cv::Mat pred) { - auto array = box_array; - int width = pred.cols; - int height = pred.rows; - - float box_x[4] = {array[0][0], array[1][0], array[2][0], array[3][0]}; - float box_y[4] = {array[0][1], array[1][1], array[2][1], array[3][1]}; - - int xmin = clamp(int(std::floorf(*(std::min_element(box_x, box_x + 4)))), 0, width - 1); - int xmax = clamp(int(std::ceilf(*(std::max_element(box_x, box_x + 4)))), 0, width - 1); - int ymin = clamp(int(std::floorf(*(std::min_element(box_y, box_y + 4)))), 0, height - 1); - int ymax = clamp(int(std::ceilf(*(std::max_element(box_y, box_y + 4)))), 0, height - 1); - - cv::Mat mask; - mask = cv::Mat::zeros(ymax - ymin + 1, xmax - xmin + 1, CV_8UC1); - - cv::Point root_point[4]; - root_point[0] = cv::Point(int(array[0][0]) - xmin, int(array[0][1]) - ymin); - root_point[1] = cv::Point(int(array[1][0]) - xmin, int(array[1][1]) - ymin); - root_point[2] = cv::Point(int(array[2][0]) - xmin, int(array[2][1]) - ymin); - root_point[3] = cv::Point(int(array[3][0]) - xmin, int(array[3][1]) - ymin); - const cv::Point *ppt[1] = {root_point}; - int npt[] = {4}; - cv::fillPoly(mask, ppt, npt, 1, cv::Scalar(1)); - - cv::Mat croppedImg; - pred(cv::Rect(xmin, ymin, xmax - xmin + 1, ymax - ymin + 1)).copyTo(croppedImg); - - auto score = cv::mean(croppedImg, mask)[0]; - return score; -} - - -std::vector>> -boxes_from_bitmap(const cv::Mat& pred, const cv::Mat& bitmap) { - const int min_size = 3; - const int max_candidates = 1000; - const float box_thresh = 0.5; - - int width = bitmap.cols; - int height = bitmap.rows; - - std::vector> contours; - std::vector hierarchy; - - cv::findContours(bitmap, contours, hierarchy, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE); - - int num_contours = contours.size() >= max_candidates ? max_candidates : contours.size(); - - std::vector>> boxes; - - for (int _i = 0; _i < num_contours; _i++) { - float ssid; - cv::RotatedRect box = cv::minAreaRect(contours[_i]); - auto array = get_mini_boxes(box, ssid); - - auto box_for_unclip = array; - //end get_mini_box - - if (ssid < min_size) { - continue; - } - - float score; - score = box_score_fast(array, pred); - //end box_score_fast - if (score < box_thresh){ - continue; - } - - - // start for unclip - cv::RotatedRect points = unclip(box_for_unclip); - // end for unclip - - cv::RotatedRect clipbox = points; - auto cliparray = get_mini_boxes(clipbox, ssid); - - if (ssid < min_size + 2) continue; - - int dest_width = pred.cols; - int dest_height = pred.rows; - std::vector> intcliparray; - - for (int num_pt = 0; num_pt < 4; num_pt++) { - std::vector a{ - int(clampf(roundf(cliparray[num_pt][0] / float(width) * float(dest_width)), 0, - float(dest_width))), - int(clampf(roundf(cliparray[num_pt][1] / float(height) * float(dest_height)), 0, - float(dest_height)))}; - intcliparray.emplace_back(std::move(a)); - } - boxes.emplace_back(std::move(intcliparray)); - - }//end for - return boxes; -} - -int _max(int a, int b) { - return a >= b ? a : b; -} - -int _min(int a, int b) { - return a >= b ? b : a; -} - -std::vector>> -filter_tag_det_res(const std::vector>>& o_boxes, - float ratio_h, float ratio_w,const cv::Mat& srcimg) { - int oriimg_h = srcimg.rows; - int oriimg_w = srcimg.cols; - std::vector>> boxes{o_boxes}; - std::vector>> root_points; - for (int n = 0; n < boxes.size(); n++) { - boxes[n] = order_points_clockwise(boxes[n]); - for (int m = 0; m < boxes[0].size(); m++) { - boxes[n][m][0] /= ratio_w; - boxes[n][m][1] /= ratio_h; - - boxes[n][m][0] = int(_min(_max(boxes[n][m][0], 0), oriimg_w - 1)); - boxes[n][m][1] = int(_min(_max(boxes[n][m][1], 0), oriimg_h - 1)); - } - } - - for (int n = 0; n < boxes.size(); n++) { - int rect_width, rect_height; - rect_width = int(sqrt( - pow(boxes[n][0][0] - boxes[n][1][0], 2) + pow(boxes[n][0][1] - boxes[n][1][1], 2))); - rect_height = int(sqrt( - pow(boxes[n][0][0] - boxes[n][3][0], 2) + pow(boxes[n][0][1] - boxes[n][3][1], 2))); - if (rect_width <= 10 || rect_height <= 10) - continue; - root_points.push_back(boxes[n]); - } - return root_points; -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/ocr_db_post_process.h b/deploy/android_demo/app/src/main/cpp/ocr_db_post_process.h deleted file mode 100644 index 86117512..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_db_post_process.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Created by fujiayi on 2020/7/2. -// -#pragma once -#include -#include - -std::vector>> -boxes_from_bitmap(const cv::Mat &pred, const cv::Mat &bitmap); - -std::vector>> -filter_tag_det_res( - const std::vector>> &o_boxes, - float ratio_h, - float ratio_w, - const cv::Mat &srcimg -); \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.cpp b/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.cpp deleted file mode 100644 index 3d014771..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.cpp +++ /dev/null @@ -1,186 +0,0 @@ -// -// Created by fujiayi on 2020/7/1. -// - -#include "ocr_ppredictor.h" -#include "preprocess.h" -#include "common.h" -#include "ocr_db_post_process.h" -#include "ocr_crnn_process.h" - -namespace ppredictor { - -OCR_PPredictor::OCR_PPredictor(const OCR_Config &config) : _config(config) { - -} - -int -OCR_PPredictor::init(const std::string &det_model_content, const std::string &rec_model_content) { - _det_predictor = std::unique_ptr( - new PPredictor{_config.thread_num, NET_OCR, _config.mode}); - _det_predictor->init_nb(det_model_content); - - _rec_predictor = std::unique_ptr( - new PPredictor{_config.thread_num, NET_OCR_INTERNAL, _config.mode}); - _rec_predictor->init_nb(rec_model_content); - return RETURN_OK; -} - -int OCR_PPredictor::init_from_file(const std::string &det_model_path, const std::string &rec_model_path){ - _det_predictor = std::unique_ptr( - new PPredictor{_config.thread_num, NET_OCR, _config.mode}); - _det_predictor->init_from_file(det_model_path); - - _rec_predictor = std::unique_ptr( - new PPredictor{_config.thread_num, NET_OCR_INTERNAL, _config.mode}); - _rec_predictor->init_from_file(rec_model_path); - return RETURN_OK; -} -/** - * for debug use, show result of First Step - * @param filter_boxes - * @param boxes - * @param srcimg - */ -static void visual_img(const std::vector>> &filter_boxes, - const std::vector>> &boxes, - const cv::Mat &srcimg) { - // visualization - cv::Point rook_points[filter_boxes.size()][4]; - for (int n = 0; n < filter_boxes.size(); n++) { - for (int m = 0; m < filter_boxes[0].size(); m++) { - rook_points[n][m] = cv::Point(int(filter_boxes[n][m][0]), int(filter_boxes[n][m][1])); - } - } - - cv::Mat img_vis; - srcimg.copyTo(img_vis); - for (int n = 0; n < boxes.size(); n++) { - const cv::Point *ppt[1] = {rook_points[n]}; - int npt[] = {4}; - cv::polylines(img_vis, ppt, npt, 1, 1, CV_RGB(0, 255, 0), 2, 8, 0); - } - // 调试用,自行替换需要修改的路径 - cv::imwrite("/sdcard/1/vis.png", img_vis); -} - -std::vector -OCR_PPredictor::infer_ocr(const std::vector &dims, const float *input_data, int input_len, - int net_flag, cv::Mat &origin) { - - PredictorInput input = _det_predictor->get_first_input(); - input.set_dims(dims); - input.set_data(input_data, input_len); - std::vector results = _det_predictor->infer(); - PredictorOutput &res = results.at(0); - std::vector>> filtered_box - = calc_filtered_boxes(res.get_float_data(), res.get_size(), (int) dims[2], (int) dims[3], - origin); - LOGI("Filter_box size %ld", filtered_box.size()); - return infer_rec(filtered_box, origin); -} - -std::vector -OCR_PPredictor::infer_rec(const std::vector>> &boxes, - const cv::Mat &origin_img) { - std::vector mean = {0.5f, 0.5f, 0.5f}; - std::vector scale = {1 / 0.5f, 1 / 0.5f, 1 / 0.5f}; - std::vector dims = {1, 3, 0, 0}; - std::vector ocr_results; - - PredictorInput input = _rec_predictor->get_first_input(); - for (auto bp = boxes.crbegin(); bp != boxes.crend(); ++bp) { - const std::vector> &box = *bp; - cv::Mat crop_img = get_rotate_crop_image(origin_img, box); - float wh_ratio = float(crop_img.cols) / float(crop_img.rows); - cv::Mat input_image = crnn_resize_img(crop_img, wh_ratio); - input_image.convertTo(input_image, CV_32FC3, 1 / 255.0f); - const float *dimg = reinterpret_cast(input_image.data); - int input_size = input_image.rows * input_image.cols; - - dims[2] = input_image.rows; - dims[3] = input_image.cols; - input.set_dims(dims); - - neon_mean_scale(dimg, input.get_mutable_float_data(), input_size, mean, scale); - - std::vector results = _rec_predictor->infer(); - - OCRPredictResult res; - res.word_index = postprocess_rec_word_index(results.at(0)); - if (res.word_index.empty()) { - continue; - } - res.score = postprocess_rec_score(results.at(1)); - res.points = box; - ocr_results.emplace_back(std::move(res)); - } - LOGI("ocr_results finished %lu", ocr_results.size()); - return ocr_results; -} - -std::vector>> -OCR_PPredictor::calc_filtered_boxes(const float *pred, int pred_size, int output_height, - int output_width, const cv::Mat &origin) { - const double threshold = 0.3; - const double maxvalue = 1; - - cv::Mat pred_map = cv::Mat::zeros(output_height, output_width, CV_32F); - memcpy(pred_map.data, pred, pred_size * sizeof(float)); - cv::Mat cbuf_map; - pred_map.convertTo(cbuf_map, CV_8UC1); - - cv::Mat bit_map; - cv::threshold(cbuf_map, bit_map, threshold, maxvalue, cv::THRESH_BINARY); - - std::vector>> boxes = boxes_from_bitmap(pred_map, bit_map); - float ratio_h = output_height * 1.0f / origin.rows; - float ratio_w = output_width * 1.0f / origin.cols; - std::vector>> filter_boxes = filter_tag_det_res(boxes, ratio_h, - ratio_w, origin); - return filter_boxes; -} - -std::vector OCR_PPredictor::postprocess_rec_word_index(const PredictorOutput &res) { - const int *rec_idx = res.get_int_data(); - const std::vector> rec_idx_lod = res.get_lod(); - - std::vector pred_idx; - for (int n = int(rec_idx_lod[0][0]); n < int(rec_idx_lod[0][1] * 2); n += 2) { - pred_idx.emplace_back(rec_idx[n]); - } - return pred_idx; -} - -float OCR_PPredictor::postprocess_rec_score(const PredictorOutput &res) { - const float *predict_batch = res.get_float_data(); - const std::vector predict_shape = res.get_shape(); - const std::vector> predict_lod = res.get_lod(); - int blank = predict_shape[1]; - float score = 0.f; - int count = 0; - for (int n = predict_lod[0][0]; n < predict_lod[0][1] - 1; n++) { - int argmax_idx = argmax(predict_batch + n * predict_shape[1], - predict_batch + (n + 1) * predict_shape[1]); - float max_value = predict_batch[n * predict_shape[1] + argmax_idx]; - if (blank - 1 - argmax_idx > 1e-5) { - score += max_value; - count += 1; - } - - } - if (count == 0) { - LOGE("calc score count 0"); - } else { - score /= count; - } - LOGI("calc score: %f", score); - return score; - -} - - -NET_TYPE OCR_PPredictor::get_net_flag() const { - return NET_OCR; -} -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h b/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h deleted file mode 100644 index eb2bc3bc..00000000 --- a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h +++ /dev/null @@ -1,112 +0,0 @@ -// -// Created by fujiayi on 2020/7/1. -// - -#pragma once - -#include -#include -#include -#include "ppredictor.h" - -namespace ppredictor { - -/** - * Config - */ -struct OCR_Config { - int thread_num = 4; // Thread num - paddle::lite_api::PowerMode mode = paddle::lite_api::LITE_POWER_HIGH; // PaddleLite Mode -}; - -/** - * PolyGone Result - */ -struct OCRPredictResult { - std::vector word_index; - std::vector> points; - float score; -}; - -/** - * OCR there are 2 models - * 1. First model(det),select polygones to show where are the texts - * 2. crop from the origin images, use these polygones to infer - */ -class OCR_PPredictor : public PPredictor_Interface { -public: - OCR_PPredictor(const OCR_Config &config); - - virtual ~OCR_PPredictor() { - - } - - /** - * 初始化二个模型的Predictor - * @param det_model_content - * @param rec_model_content - * @return - */ - int init(const std::string &det_model_content, const std::string &rec_model_content); - int init_from_file(const std::string &det_model_path, const std::string &rec_model_path); - /** - * Return OCR result - * @param dims - * @param input_data - * @param input_len - * @param net_flag - * @param origin - * @return - */ - virtual std::vector - infer_ocr(const std::vector &dims, const float *input_data, int input_len, - int net_flag, cv::Mat &origin); - - - virtual NET_TYPE get_net_flag() const; - - -private: - - /** - * calcul Polygone from the result image of first model - * @param pred - * @param output_height - * @param output_width - * @param origin - * @return - */ - std::vector>> - calc_filtered_boxes(const float *pred, int pred_size, int output_height, int output_width, - const cv::Mat &origin); - - /** - * infer for second model - * - * @param boxes - * @param origin - * @return - */ - std::vector - infer_rec(const std::vector>> &boxes, const cv::Mat &origin); - - /** - * Postprocess or sencod model to extract text - * @param res - * @return - */ - std::vector postprocess_rec_word_index(const PredictorOutput &res); - - /** - * calculate confidence of second model text result - * @param res - * @return - */ - float postprocess_rec_score(const PredictorOutput &res); - - std::unique_ptr _det_predictor; - std::unique_ptr _rec_predictor; - OCR_Config _config; - -}; -} diff --git a/deploy/android_demo/app/src/main/cpp/ppredictor.cpp b/deploy/android_demo/app/src/main/cpp/ppredictor.cpp deleted file mode 100644 index a9086bc6..00000000 --- a/deploy/android_demo/app/src/main/cpp/ppredictor.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "ppredictor.h" -#include "common.h" - -namespace ppredictor { -PPredictor::PPredictor(int thread_num, int net_flag, paddle::lite_api::PowerMode mode) : - _thread_num(thread_num), _net_flag(net_flag), _mode(mode) { -} - -int PPredictor::init_nb(const std::string &model_content) { - paddle::lite_api::MobileConfig config; - config.set_model_from_buffer(model_content); - return _init(config); -} - -int PPredictor::init_from_file(const std::string &model_content){ - paddle::lite_api::MobileConfig config; - config.set_model_from_file(model_content); - return _init(config); -} - -template -int PPredictor::_init(ConfigT &config) { - config.set_threads(_thread_num); - config.set_power_mode(_mode); - _predictor = paddle::lite_api::CreatePaddlePredictor(config); - LOGI("paddle instance created"); - return RETURN_OK; -} - -PredictorInput PPredictor::get_input(int index) { - PredictorInput input{_predictor->GetInput(index), index, _net_flag}; - _is_input_get = true; - return input; -} - -std::vector PPredictor::get_inputs(int num) { - std::vector results; - for (int i = 0; i < num; i++) { - results.emplace_back(get_input(i)); - } - return results; -} - -PredictorInput PPredictor::get_first_input() { - return get_input(0); -} - -std::vector PPredictor::infer() { - LOGI("infer Run start %d", _net_flag); - std::vector results; - if (!_is_input_get) { - return results; - } - _predictor->Run(); - LOGI("infer Run end"); - - for (int i = 0; i < _predictor->GetOutputNames().size(); i++) { - std::unique_ptr output_tensor = _predictor->GetOutput(i); - LOGI("output tensor[%d] size %ld", i, product(output_tensor->shape())); - PredictorOutput result{std::move(output_tensor), i, _net_flag}; - results.emplace_back(std::move(result)); - } - return results; -} - -NET_TYPE PPredictor::get_net_flag() const { - return (NET_TYPE) _net_flag; -} - -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/ppredictor.h b/deploy/android_demo/app/src/main/cpp/ppredictor.h deleted file mode 100644 index 1391109f..00000000 --- a/deploy/android_demo/app/src/main/cpp/ppredictor.h +++ /dev/null @@ -1,74 +0,0 @@ -#pragma once - -#include "paddle_api.h" -#include "predictor_input.h" -#include "predictor_output.h" - -namespace ppredictor { - -/** - * PaddleLite Preditor Common Interface - */ -class PPredictor_Interface { -public: - virtual ~PPredictor_Interface() { - - } - - - virtual NET_TYPE get_net_flag() const = 0; - -}; - -/** - * Common Predictor - */ -class PPredictor : public PPredictor_Interface { -public: - PPredictor(int thread_num, int net_flag = 0, - paddle::lite_api::PowerMode mode = paddle::lite_api::LITE_POWER_HIGH); - - virtual ~PPredictor() { - - } - - /** - * init paddlitelite opt model,nb format ,or use ini_paddle - * @param model_content - * @return 0 - */ - virtual int init_nb(const std::string &model_content); - - virtual int init_from_file(const std::string &model_content); - - std::vector infer(); - - std::shared_ptr get_predictor() { - return _predictor; - } - - virtual std::vector get_inputs(int num); - - virtual PredictorInput get_input(int index); - - virtual PredictorInput get_first_input(); - - virtual NET_TYPE get_net_flag() const; - -protected: - template - int _init(ConfigT &config); - -private: - int _thread_num; - paddle::lite_api::PowerMode _mode; - std::shared_ptr _predictor; - bool _is_input_get = false; - int _net_flag; - -}; - - -} - - diff --git a/deploy/android_demo/app/src/main/cpp/predictor_input.cpp b/deploy/android_demo/app/src/main/cpp/predictor_input.cpp deleted file mode 100644 index 9a1dd223..00000000 --- a/deploy/android_demo/app/src/main/cpp/predictor_input.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "predictor_input.h" - -namespace ppredictor { - - -void PredictorInput::set_dims(std::vector dims) { - // yolov3 - if (_net_flag == 101 && _index == 1) { - _tensor->Resize({1, 2}); - _tensor->mutable_data()[0] = (int) dims.at(2); - _tensor->mutable_data()[1] = (int) dims.at(3); - } else { - _tensor->Resize(dims); - } - _is_dims_set = true; -} - -float *PredictorInput::get_mutable_float_data() { - if (!_is_dims_set) { - LOGE("PredictorInput::set_dims is not called"); - } - return _tensor->mutable_data(); -} - -void PredictorInput::set_data(const float *input_data, int input_float_len) { - float *input_raw_data = get_mutable_float_data(); - memcpy(input_raw_data, input_data, input_float_len * sizeof(float)); -} -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/predictor_input.h b/deploy/android_demo/app/src/main/cpp/predictor_input.h deleted file mode 100644 index b48db189..00000000 --- a/deploy/android_demo/app/src/main/cpp/predictor_input.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include -#include -#include "common.h" - -namespace ppredictor { -class PredictorInput { -public: - PredictorInput(std::unique_ptr &&tensor, int index, int net_flag) : - _tensor(std::move(tensor)), _index(index),_net_flag(net_flag) { - - } - - - void set_dims(std::vector dims); - - float *get_mutable_float_data(); - - void set_data(const float *input_data, int input_float_len); - -private: - std::unique_ptr _tensor; - bool _is_dims_set = false; - int _index; - int _net_flag; -}; -} diff --git a/deploy/android_demo/app/src/main/cpp/predictor_output.cpp b/deploy/android_demo/app/src/main/cpp/predictor_output.cpp deleted file mode 100644 index 08155633..00000000 --- a/deploy/android_demo/app/src/main/cpp/predictor_output.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "predictor_output.h" -namespace ppredictor { -const float* PredictorOutput::get_float_data() const{ - return _tensor->data(); -} - -const int* PredictorOutput::get_int_data() const{ - return _tensor->data(); -} - -const std::vector> PredictorOutput::get_lod() const{ - return _tensor->lod(); -} - -int64_t PredictorOutput::get_size() const{ - if (_net_flag == NET_OCR) { - return _tensor->shape().at(2) * _tensor->shape().at(3); - } else { - return product(_tensor->shape()); - } -} - -const std::vector PredictorOutput::get_shape() const{ - return _tensor->shape(); - -} -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/predictor_output.h b/deploy/android_demo/app/src/main/cpp/predictor_output.h deleted file mode 100644 index ec7086c6..00000000 --- a/deploy/android_demo/app/src/main/cpp/predictor_output.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include -#include -#include "common.h" - -namespace ppredictor { -class PredictorOutput { -public: - PredictorOutput(){ - - } - PredictorOutput(std::unique_ptr &&tensor, int index, int net_flag) : - _tensor(std::move(tensor)), _index(index), _net_flag(net_flag) { - - } - - const float* get_float_data() const; - const int* get_int_data() const; - int64_t get_size() const; - const std::vector> get_lod() const; - const std::vector get_shape() const; - - std::vector data; // return float, or use data_int - std::vector data_int; // several layers return int ,or use data - std::vector shape; // PaddleLite output shape - std::vector> lod; // PaddleLite output lod - -private: - std::unique_ptr _tensor; - int _index; - int _net_flag; -}; -} - diff --git a/deploy/android_demo/app/src/main/cpp/preprocess.cpp b/deploy/android_demo/app/src/main/cpp/preprocess.cpp deleted file mode 100644 index 5543cdd1..00000000 --- a/deploy/android_demo/app/src/main/cpp/preprocess.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "preprocess.h" -#include - -cv::Mat bitmap_to_cv_mat(JNIEnv *env, jobject bitmap) { - AndroidBitmapInfo info; - int result = AndroidBitmap_getInfo(env, bitmap, &info); - if (result != ANDROID_BITMAP_RESULT_SUCCESS) { - LOGE("AndroidBitmap_getInfo failed, result: %d", result); - return cv::Mat{}; - } - if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { - LOGE("Bitmap format is not RGBA_8888 !"); - return cv::Mat{}; - } - unsigned char *srcData = NULL; - AndroidBitmap_lockPixels(env, bitmap, (void **) &srcData); - cv::Mat mat = cv::Mat::zeros(info.height, info.width, CV_8UC4); - memcpy(mat.data, srcData, info.height * info.width * 4); - AndroidBitmap_unlockPixels(env, bitmap); - cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGR); - /** - if (!cv::imwrite("/sdcard/1/copy.jpg", mat)){ - LOGE("Write image failed " ); - } - */ - - return mat; -} - -cv::Mat resize_img(const cv::Mat& img, int height, int width){ - if (img.rows == height && img.cols == width){ - return img; - } - cv::Mat new_img; - cv::resize(img, new_img, cv::Size(height, width)); - return new_img; -} - -// fill tensor with mean and scale and trans layout: nhwc -> nchw, neon speed up -void neon_mean_scale(const float* din, - float* dout, - int size, - const std::vector& mean, - const std::vector& scale) { - if (mean.size() != 3 || scale.size() != 3) { - LOGE("[ERROR] mean or scale size must equal to 3"); - return; - } - - float32x4_t vmean0 = vdupq_n_f32(mean[0]); - float32x4_t vmean1 = vdupq_n_f32(mean[1]); - float32x4_t vmean2 = vdupq_n_f32(mean[2]); - float32x4_t vscale0 = vdupq_n_f32(scale[0]); - float32x4_t vscale1 = vdupq_n_f32(scale[1]); - float32x4_t vscale2 = vdupq_n_f32(scale[2]); - - float* dout_c0 = dout; - float* dout_c1 = dout + size; - float* dout_c2 = dout + size * 2; - - int i = 0; - for (; i < size - 3; i += 4) { - float32x4x3_t vin3 = vld3q_f32(din); - float32x4_t vsub0 = vsubq_f32(vin3.val[0], vmean0); - float32x4_t vsub1 = vsubq_f32(vin3.val[1], vmean1); - float32x4_t vsub2 = vsubq_f32(vin3.val[2], vmean2); - float32x4_t vs0 = vmulq_f32(vsub0, vscale0); - float32x4_t vs1 = vmulq_f32(vsub1, vscale1); - float32x4_t vs2 = vmulq_f32(vsub2, vscale2); - vst1q_f32(dout_c0, vs0); - vst1q_f32(dout_c1, vs1); - vst1q_f32(dout_c2, vs2); - - din += 12; - dout_c0 += 4; - dout_c1 += 4; - dout_c2 += 4; - } - for (; i < size; i++) { - *(dout_c0++) = (*(din++) - mean[0]) * scale[0]; - *(dout_c1++) = (*(din++) - mean[1]) * scale[1]; - *(dout_c2++) = (*(din++) - mean[2]) * scale[2]; - } -} \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/cpp/preprocess.h b/deploy/android_demo/app/src/main/cpp/preprocess.h deleted file mode 100644 index c256c440..00000000 --- a/deploy/android_demo/app/src/main/cpp/preprocess.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include -#include "common.h" -cv::Mat bitmap_to_cv_mat(JNIEnv *env, jobject bitmap); - -cv::Mat resize_img(const cv::Mat& img, int height, int width); - -void neon_mean_scale(const float* din, - float* dout, - int size, - const std::vector& mean, - const std::vector& scale); diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java deleted file mode 100644 index 49af0afe..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.baidu.paddle.lite.demo.ocr; - -import android.content.res.Configuration; -import android.os.Bundle; -import android.preference.PreferenceActivity; -import android.view.MenuInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.LayoutRes; -import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.appcompat.widget.Toolbar; - -/** - * A {@link PreferenceActivity} which implements and proxies the necessary calls - * to be used with AppCompat. - *

- * This technique can be used with an {@link android.app.Activity} class, not just - * {@link PreferenceActivity}. - */ -public abstract class AppCompatPreferenceActivity extends PreferenceActivity { - private AppCompatDelegate mDelegate; - - @Override - protected void onCreate(Bundle savedInstanceState) { - getDelegate().installViewFactory(); - getDelegate().onCreate(savedInstanceState); - super.onCreate(savedInstanceState); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - getDelegate().onPostCreate(savedInstanceState); - } - - public ActionBar getSupportActionBar() { - return getDelegate().getSupportActionBar(); - } - - public void setSupportActionBar(@Nullable Toolbar toolbar) { - getDelegate().setSupportActionBar(toolbar); - } - - @Override - public MenuInflater getMenuInflater() { - return getDelegate().getMenuInflater(); - } - - @Override - public void setContentView(@LayoutRes int layoutResID) { - getDelegate().setContentView(layoutResID); - } - - @Override - public void setContentView(View view) { - getDelegate().setContentView(view); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - getDelegate().setContentView(view, params); - } - - @Override - public void addContentView(View view, ViewGroup.LayoutParams params) { - getDelegate().addContentView(view, params); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getDelegate().onPostResume(); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - super.onTitleChanged(title, color); - getDelegate().setTitle(title); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getDelegate().onConfigurationChanged(newConfig); - } - - @Override - protected void onStop() { - super.onStop(); - getDelegate().onStop(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - getDelegate().onDestroy(); - } - - public void invalidateOptionsMenu() { - getDelegate().invalidateOptionsMenu(); - } - - private AppCompatDelegate getDelegate() { - if (mDelegate == null) { - mDelegate = AppCompatDelegate.create(this, null); - } - return mDelegate; - } -} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java deleted file mode 100644 index afb261dc..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java +++ /dev/null @@ -1,473 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.Manifest; -import android.app.ProgressDialog; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.media.ExifInterface; -import android.net.Uri; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Message; -import android.preference.PreferenceManager; -import android.provider.MediaStore; -import android.text.method.ScrollingMovementMethod; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.core.content.FileProvider; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.text.SimpleDateFormat; -import java.util.Date; - -public class MainActivity extends AppCompatActivity { - private static final String TAG = MainActivity.class.getSimpleName(); - public static final int OPEN_GALLERY_REQUEST_CODE = 0; - public static final int TAKE_PHOTO_REQUEST_CODE = 1; - - public static final int REQUEST_LOAD_MODEL = 0; - public static final int REQUEST_RUN_MODEL = 1; - public static final int RESPONSE_LOAD_MODEL_SUCCESSED = 0; - public static final int RESPONSE_LOAD_MODEL_FAILED = 1; - public static final int RESPONSE_RUN_MODEL_SUCCESSED = 2; - public static final int RESPONSE_RUN_MODEL_FAILED = 3; - - protected ProgressDialog pbLoadModel = null; - protected ProgressDialog pbRunModel = null; - - protected Handler receiver = null; // Receive messages from worker thread - protected Handler sender = null; // Send command to worker thread - protected HandlerThread worker = null; // Worker thread to load&run model - - // UI components of object detection - protected TextView tvInputSetting; - protected ImageView ivInputImage; - protected TextView tvOutputResult; - protected TextView tvInferenceTime; - - // Model settings of object detection - protected String modelPath = ""; - protected String labelPath = ""; - protected String imagePath = ""; - protected int cpuThreadNum = 1; - protected String cpuPowerMode = ""; - protected String inputColorFormat = ""; - protected long[] inputShape = new long[]{}; - protected float[] inputMean = new float[]{}; - protected float[] inputStd = new float[]{}; - protected float scoreThreshold = 0.1f; - private String currentPhotoPath; - - protected Predictor predictor = new Predictor(); - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - // Clear all setting items to avoid app crashing due to the incorrect settings - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.clear(); - editor.commit(); - - // Prepare the worker thread for mode loading and inference - receiver = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case RESPONSE_LOAD_MODEL_SUCCESSED: - pbLoadModel.dismiss(); - onLoadModelSuccessed(); - break; - case RESPONSE_LOAD_MODEL_FAILED: - pbLoadModel.dismiss(); - Toast.makeText(MainActivity.this, "Load model failed!", Toast.LENGTH_SHORT).show(); - onLoadModelFailed(); - break; - case RESPONSE_RUN_MODEL_SUCCESSED: - pbRunModel.dismiss(); - onRunModelSuccessed(); - break; - case RESPONSE_RUN_MODEL_FAILED: - pbRunModel.dismiss(); - Toast.makeText(MainActivity.this, "Run model failed!", Toast.LENGTH_SHORT).show(); - onRunModelFailed(); - break; - default: - break; - } - } - }; - - worker = new HandlerThread("Predictor Worker"); - worker.start(); - sender = new Handler(worker.getLooper()) { - public void handleMessage(Message msg) { - switch (msg.what) { - case REQUEST_LOAD_MODEL: - // Load model and reload test image - if (onLoadModel()) { - receiver.sendEmptyMessage(RESPONSE_LOAD_MODEL_SUCCESSED); - } else { - receiver.sendEmptyMessage(RESPONSE_LOAD_MODEL_FAILED); - } - break; - case REQUEST_RUN_MODEL: - // Run model if model is loaded - if (onRunModel()) { - receiver.sendEmptyMessage(RESPONSE_RUN_MODEL_SUCCESSED); - } else { - receiver.sendEmptyMessage(RESPONSE_RUN_MODEL_FAILED); - } - break; - default: - break; - } - } - }; - - // Setup the UI components - tvInputSetting = findViewById(R.id.tv_input_setting); - ivInputImage = findViewById(R.id.iv_input_image); - tvInferenceTime = findViewById(R.id.tv_inference_time); - tvOutputResult = findViewById(R.id.tv_output_result); - tvInputSetting.setMovementMethod(ScrollingMovementMethod.getInstance()); - tvOutputResult.setMovementMethod(ScrollingMovementMethod.getInstance()); - } - - @Override - protected void onResume() { - super.onResume(); - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - boolean settingsChanged = false; - String model_path = sharedPreferences.getString(getString(R.string.MODEL_PATH_KEY), - getString(R.string.MODEL_PATH_DEFAULT)); - String label_path = sharedPreferences.getString(getString(R.string.LABEL_PATH_KEY), - getString(R.string.LABEL_PATH_DEFAULT)); - String image_path = sharedPreferences.getString(getString(R.string.IMAGE_PATH_KEY), - getString(R.string.IMAGE_PATH_DEFAULT)); - settingsChanged |= !model_path.equalsIgnoreCase(modelPath); - settingsChanged |= !label_path.equalsIgnoreCase(labelPath); - settingsChanged |= !image_path.equalsIgnoreCase(imagePath); - int cpu_thread_num = Integer.parseInt(sharedPreferences.getString(getString(R.string.CPU_THREAD_NUM_KEY), - getString(R.string.CPU_THREAD_NUM_DEFAULT))); - settingsChanged |= cpu_thread_num != cpuThreadNum; - String cpu_power_mode = - sharedPreferences.getString(getString(R.string.CPU_POWER_MODE_KEY), - getString(R.string.CPU_POWER_MODE_DEFAULT)); - settingsChanged |= !cpu_power_mode.equalsIgnoreCase(cpuPowerMode); - String input_color_format = - sharedPreferences.getString(getString(R.string.INPUT_COLOR_FORMAT_KEY), - getString(R.string.INPUT_COLOR_FORMAT_DEFAULT)); - settingsChanged |= !input_color_format.equalsIgnoreCase(inputColorFormat); - long[] input_shape = - Utils.parseLongsFromString(sharedPreferences.getString(getString(R.string.INPUT_SHAPE_KEY), - getString(R.string.INPUT_SHAPE_DEFAULT)), ","); - float[] input_mean = - Utils.parseFloatsFromString(sharedPreferences.getString(getString(R.string.INPUT_MEAN_KEY), - getString(R.string.INPUT_MEAN_DEFAULT)), ","); - float[] input_std = - Utils.parseFloatsFromString(sharedPreferences.getString(getString(R.string.INPUT_STD_KEY) - , getString(R.string.INPUT_STD_DEFAULT)), ","); - settingsChanged |= input_shape.length != inputShape.length; - settingsChanged |= input_mean.length != inputMean.length; - settingsChanged |= input_std.length != inputStd.length; - if (!settingsChanged) { - for (int i = 0; i < input_shape.length; i++) { - settingsChanged |= input_shape[i] != inputShape[i]; - } - for (int i = 0; i < input_mean.length; i++) { - settingsChanged |= input_mean[i] != inputMean[i]; - } - for (int i = 0; i < input_std.length; i++) { - settingsChanged |= input_std[i] != inputStd[i]; - } - } - float score_threshold = - Float.parseFloat(sharedPreferences.getString(getString(R.string.SCORE_THRESHOLD_KEY), - getString(R.string.SCORE_THRESHOLD_DEFAULT))); - settingsChanged |= scoreThreshold != score_threshold; - if (settingsChanged) { - modelPath = model_path; - labelPath = label_path; - imagePath = image_path; - cpuThreadNum = cpu_thread_num; - cpuPowerMode = cpu_power_mode; - inputColorFormat = input_color_format; - inputShape = input_shape; - inputMean = input_mean; - inputStd = input_std; - scoreThreshold = score_threshold; - // Update UI - tvInputSetting.setText("Model: " + modelPath.substring(modelPath.lastIndexOf("/") + 1) + "\n" + "CPU" + - " Thread Num: " + Integer.toString(cpuThreadNum) + "\n" + "CPU Power Mode: " + cpuPowerMode); - tvInputSetting.scrollTo(0, 0); - // Reload model if configure has been changed - loadModel(); - } - } - - public void loadModel() { - pbLoadModel = ProgressDialog.show(this, "", "Loading model...", false, false); - sender.sendEmptyMessage(REQUEST_LOAD_MODEL); - } - - public void runModel() { - pbRunModel = ProgressDialog.show(this, "", "Running model...", false, false); - sender.sendEmptyMessage(REQUEST_RUN_MODEL); - } - - public boolean onLoadModel() { - return predictor.init(MainActivity.this, modelPath, labelPath, cpuThreadNum, - cpuPowerMode, - inputColorFormat, - inputShape, inputMean, - inputStd, scoreThreshold); - } - - public boolean onRunModel() { - return predictor.isLoaded() && predictor.runModel(); - } - - public void onLoadModelSuccessed() { - // Load test image from path and run model - try { - if (imagePath.isEmpty()) { - return; - } - Bitmap image = null; - // Read test image file from custom path if the first character of mode path is '/', otherwise read test - // image file from assets - if (!imagePath.substring(0, 1).equals("/")) { - InputStream imageStream = getAssets().open(imagePath); - image = BitmapFactory.decodeStream(imageStream); - } else { - if (!new File(imagePath).exists()) { - return; - } - image = BitmapFactory.decodeFile(imagePath); - } - if (image != null && predictor.isLoaded()) { - predictor.setInputImage(image); - runModel(); - } - } catch (IOException e) { - Toast.makeText(MainActivity.this, "Load image failed!", Toast.LENGTH_SHORT).show(); - e.printStackTrace(); - } - } - - public void onLoadModelFailed() { - } - - public void onRunModelSuccessed() { - // Obtain results and update UI - tvInferenceTime.setText("Inference time: " + predictor.inferenceTime() + " ms"); - Bitmap outputImage = predictor.outputImage(); - if (outputImage != null) { - ivInputImage.setImageBitmap(outputImage); - } - tvOutputResult.setText(predictor.outputResult()); - tvOutputResult.scrollTo(0, 0); - } - - public void onRunModelFailed() { - } - - public void onImageChanged(Bitmap image) { - // Rerun model if users pick test image from gallery or camera - if (image != null && predictor.isLoaded()) { - predictor.setInputImage(image); - runModel(); - } - } - - public void onSettingsClicked() { - startActivity(new Intent(MainActivity.this, SettingsActivity.class)); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.menu_action_options, menu); - return true; - } - - public boolean onPrepareOptionsMenu(Menu menu) { - boolean isLoaded = predictor.isLoaded(); - menu.findItem(R.id.open_gallery).setEnabled(isLoaded); - menu.findItem(R.id.take_photo).setEnabled(isLoaded); - return super.onPrepareOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - break; - case R.id.open_gallery: - if (requestAllPermissions()) { - openGallery(); - } - break; - case R.id.take_photo: - if (requestAllPermissions()) { - takePhoto(); - } - break; - case R.id.settings: - if (requestAllPermissions()) { - // Make sure we have SDCard r&w permissions to load model from SDCard - onSettingsClicked(); - } - break; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { - Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show(); - } - } - - private boolean requestAllPermissions() { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, - Manifest.permission.CAMERA) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.CAMERA}, - 0); - return false; - } - return true; - } - - private void openGallery() { - Intent intent = new Intent(Intent.ACTION_PICK, null); - intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); - startActivityForResult(intent, OPEN_GALLERY_REQUEST_CODE); - } - - private void takePhoto() { - Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - // Ensure that there's a camera activity to handle the intent - if (takePictureIntent.resolveActivity(getPackageManager()) != null) { - // Create the File where the photo should go - File photoFile = null; - try { - photoFile = createImageFile(); - } catch (IOException ex) { - Log.e("MainActitity", ex.getMessage(), ex); - Toast.makeText(MainActivity.this, - "Create Camera temp file failed: " + ex.getMessage(), Toast.LENGTH_SHORT).show(); - } - // Continue only if the File was successfully created - if (photoFile != null) { - Log.i(TAG, "FILEPATH " + getExternalFilesDir("Pictures").getAbsolutePath()); - Uri photoURI = FileProvider.getUriForFile(this, - "com.baidu.paddle.lite.demo.ocr.fileprovider", - photoFile); - currentPhotoPath = photoFile.getAbsolutePath(); - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); - startActivityForResult(takePictureIntent, TAKE_PHOTO_REQUEST_CODE); - Log.i(TAG, "startActivityForResult finished"); - } - } - - } - - private File createImageFile() throws IOException { - // Create an image file name - String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); - String imageFileName = "JPEG_" + timeStamp + "_"; - File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); - File image = File.createTempFile( - imageFileName, /* prefix */ - ".bmp", /* suffix */ - storageDir /* directory */ - ); - - return image; - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK) { - switch (requestCode) { - case OPEN_GALLERY_REQUEST_CODE: - if (data == null) { - break; - } - try { - ContentResolver resolver = getContentResolver(); - Uri uri = data.getData(); - Bitmap image = MediaStore.Images.Media.getBitmap(resolver, uri); - String[] proj = {MediaStore.Images.Media.DATA}; - Cursor cursor = managedQuery(uri, proj, null, null, null); - cursor.moveToFirst(); - onImageChanged(image); - } catch (IOException e) { - Log.e(TAG, e.toString()); - } - break; - case TAKE_PHOTO_REQUEST_CODE: - if (currentPhotoPath != null) { - ExifInterface exif = null; - try { - exif = new ExifInterface(currentPhotoPath); - } catch (IOException e) { - e.printStackTrace(); - } - int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, - ExifInterface.ORIENTATION_UNDEFINED); - Log.i(TAG, "rotation " + orientation); - Bitmap image = BitmapFactory.decodeFile(currentPhotoPath); - image = Utils.rotateBitmap(image, orientation); - onImageChanged(image); - } else { - Log.e(TAG, "currentPhotoPath is null"); - } - break; - default: - break; - } - } - } - - @Override - protected void onDestroy() { - if (predictor != null) { - predictor.releaseModel(); - } - worker.quit(); - super.onDestroy(); - } -} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java deleted file mode 100644 index d5608911..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Message; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; - -import java.io.IOException; -import java.io.InputStream; - -public class MiniActivity extends AppCompatActivity { - - - public static final int REQUEST_LOAD_MODEL = 0; - public static final int REQUEST_RUN_MODEL = 1; - public static final int REQUEST_UNLOAD_MODEL = 2; - public static final int RESPONSE_LOAD_MODEL_SUCCESSED = 0; - public static final int RESPONSE_LOAD_MODEL_FAILED = 1; - public static final int RESPONSE_RUN_MODEL_SUCCESSED = 2; - public static final int RESPONSE_RUN_MODEL_FAILED = 3; - - private static final String TAG = "MiniActivity"; - - protected Handler receiver = null; // Receive messages from worker thread - protected Handler sender = null; // Send command to worker thread - protected HandlerThread worker = null; // Worker thread to load&run model - protected volatile Predictor predictor = null; - - private String assetModelDirPath = "models/ocr_v1_for_cpu"; - private String assetlabelFilePath = "labels/ppocr_keys_v1.txt"; - - private Button button; - private ImageView imageView; // image result - private TextView textView; // text result - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_mini); - - Log.i(TAG, "SHOW in Logcat"); - - // Prepare the worker thread for mode loading and inference - worker = new HandlerThread("Predictor Worker"); - worker.start(); - sender = new Handler(worker.getLooper()) { - public void handleMessage(Message msg) { - switch (msg.what) { - case REQUEST_LOAD_MODEL: - // Load model and reload test image - if (!onLoadModel()) { - runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MiniActivity.this, "Load model failed!", Toast.LENGTH_SHORT).show(); - } - }); - } - break; - case REQUEST_RUN_MODEL: - // Run model if model is loaded - final boolean isSuccessed = onRunModel(); - runOnUiThread(new Runnable() { - @Override - public void run() { - if (isSuccessed){ - onRunModelSuccessed(); - }else{ - Toast.makeText(MiniActivity.this, "Run model failed!", Toast.LENGTH_SHORT).show(); - } - } - }); - break; - } - } - }; - sender.sendEmptyMessage(REQUEST_LOAD_MODEL); // corresponding to REQUEST_LOAD_MODEL, to call onLoadModel() - - imageView = findViewById(R.id.imageView); - textView = findViewById(R.id.sample_text); - button = findViewById(R.id.button); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - sender.sendEmptyMessage(REQUEST_RUN_MODEL); - } - }); - - - } - - @Override - protected void onDestroy() { - onUnloadModel(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - worker.quitSafely(); - } else { - worker.quit(); - } - super.onDestroy(); - } - - /** - * call in onCreate, model init - * - * @return - */ - private boolean onLoadModel() { - if (predictor == null) { - predictor = new Predictor(); - } - return predictor.init(this, assetModelDirPath, assetlabelFilePath); - } - - /** - * init engine - * call in onCreate - * - * @return - */ - private boolean onRunModel() { - try { - String assetImagePath = "images/5.jpg"; - InputStream imageStream = getAssets().open(assetImagePath); - Bitmap image = BitmapFactory.decodeStream(imageStream); - // Input is Bitmap - predictor.setInputImage(image); - return predictor.isLoaded() && predictor.runModel(); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - - private void onRunModelSuccessed() { - Log.i(TAG, "onRunModelSuccessed"); - textView.setText(predictor.outputResult); - imageView.setImageBitmap(predictor.outputImage); - } - - private void onUnloadModel() { - if (predictor != null) { - predictor.releaseModel(); - } - } -} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java deleted file mode 100644 index 2e78a3ec..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.graphics.Bitmap; -import android.util.Log; - -import java.util.ArrayList; -import java.util.concurrent.atomic.AtomicBoolean; - -public class OCRPredictorNative { - - private static final AtomicBoolean isSOLoaded = new AtomicBoolean(); - - public static void loadLibrary() throws RuntimeException { - if (!isSOLoaded.get() && isSOLoaded.compareAndSet(false, true)) { - try { - System.loadLibrary("Native"); - } catch (Throwable e) { - RuntimeException exception = new RuntimeException( - "Load libNative.so failed, please check it exists in apk file.", e); - throw exception; - } - } - } - - private Config config; - - private long nativePointer = 0; - - public OCRPredictorNative(Config config) { - this.config = config; - loadLibrary(); - nativePointer = init(config.detModelFilename, config.recModelFilename, - config.cpuThreadNum, config.cpuPower); - Log.i("OCRPredictorNative", "load success " + nativePointer); - - } - - public void release() { - if (nativePointer != 0) { - nativePointer = 0; - destory(nativePointer); - } - } - - public ArrayList runImage(float[] inputData, int width, int height, int channels, Bitmap originalImage) { - Log.i("OCRPredictorNative", "begin to run image " + inputData.length + " " + width + " " + height); - float[] dims = new float[]{1, channels, height, width}; - float[] rawResults = forward(nativePointer, inputData, dims, originalImage); - ArrayList results = postprocess(rawResults); - return results; - } - - public static class Config { - public int cpuThreadNum; - public String cpuPower; - public String detModelFilename; - public String recModelFilename; - - } - - protected native long init(String detModelPath, String recModelPath, int threadNum, String cpuMode); - - protected native float[] forward(long pointer, float[] buf, float[] ddims, Bitmap originalImage); - - protected native void destory(long pointer); - - private ArrayList postprocess(float[] raw) { - ArrayList results = new ArrayList(); - int begin = 0; - - while (begin < raw.length) { - int point_num = Math.round(raw[begin]); - int word_num = Math.round(raw[begin + 1]); - OcrResultModel model = parse(raw, begin + 2, point_num, word_num); - begin += 2 + 1 + point_num * 2 + word_num; - results.add(model); - } - - return results; - } - - private OcrResultModel parse(float[] raw, int begin, int pointNum, int wordNum) { - int current = begin; - OcrResultModel model = new OcrResultModel(); - model.setConfidence(raw[current]); - current++; - for (int i = 0; i < pointNum; i++) { - model.addPoints(Math.round(raw[current + i * 2]), Math.round(raw[current + i * 2 + 1])); - } - current += (pointNum * 2); - for (int i = 0; i < wordNum; i++) { - int index = Math.round(raw[current + i]); - model.addWordIndex(index); - } - Log.i("OCRPredictorNative", "word finished " + wordNum); - return model; - } - - -} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OcrResultModel.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OcrResultModel.java deleted file mode 100644 index 9494574e..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OcrResultModel.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.graphics.Point; - -import java.util.ArrayList; -import java.util.List; - -public class OcrResultModel { - private List points; - private List wordIndex; - private String label; - private float confidence; - - public OcrResultModel() { - super(); - points = new ArrayList<>(); - wordIndex = new ArrayList<>(); - } - - public void addPoints(int x, int y) { - Point point = new Point(x, y); - points.add(point); - } - - public void addWordIndex(int index) { - wordIndex.add(index); - } - - public List getPoints() { - return points; - } - - public List getWordIndex() { - return wordIndex; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public float getConfidence() { - return confidence; - } - - public void setConfidence(float confidence) { - this.confidence = confidence; - } -} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java deleted file mode 100644 index 078bba28..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java +++ /dev/null @@ -1,355 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.Point; -import android.util.Log; - -import java.io.File; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Vector; - -import static android.graphics.Color.*; - -public class Predictor { - private static final String TAG = Predictor.class.getSimpleName(); - public boolean isLoaded = false; - public int warmupIterNum = 1; - public int inferIterNum = 1; - public int cpuThreadNum = 4; - public String cpuPowerMode = "LITE_POWER_HIGH"; - public String modelPath = ""; - public String modelName = ""; - protected OCRPredictorNative paddlePredictor = null; - protected float inferenceTime = 0; - // Only for object detection - protected Vector wordLabels = new Vector(); - protected String inputColorFormat = "BGR"; - protected long[] inputShape = new long[]{1, 3, 960}; - protected float[] inputMean = new float[]{0.485f, 0.456f, 0.406f}; - protected float[] inputStd = new float[]{1.0f / 0.229f, 1.0f / 0.224f, 1.0f / 0.225f}; - protected float scoreThreshold = 0.1f; - protected Bitmap inputImage = null; - protected Bitmap outputImage = null; - protected volatile String outputResult = ""; - protected float preprocessTime = 0; - protected float postprocessTime = 0; - - - public Predictor() { - } - - public boolean init(Context appCtx, String modelPath, String labelPath) { - isLoaded = loadModel(appCtx, modelPath, cpuThreadNum, cpuPowerMode); - if (!isLoaded) { - return false; - } - isLoaded = loadLabel(appCtx, labelPath); - return isLoaded; - } - - - public boolean init(Context appCtx, String modelPath, String labelPath, int cpuThreadNum, String cpuPowerMode, - String inputColorFormat, - long[] inputShape, float[] inputMean, - float[] inputStd, float scoreThreshold) { - if (inputShape.length != 3) { - Log.e(TAG, "Size of input shape should be: 3"); - return false; - } - if (inputMean.length != inputShape[1]) { - Log.e(TAG, "Size of input mean should be: " + Long.toString(inputShape[1])); - return false; - } - if (inputStd.length != inputShape[1]) { - Log.e(TAG, "Size of input std should be: " + Long.toString(inputShape[1])); - return false; - } - if (inputShape[0] != 1) { - Log.e(TAG, "Only one batch is supported in the image classification demo, you can use any batch size in " + - "your Apps!"); - return false; - } - if (inputShape[1] != 1 && inputShape[1] != 3) { - Log.e(TAG, "Only one/three channels are supported in the image classification demo, you can use any " + - "channel size in your Apps!"); - return false; - } - if (!inputColorFormat.equalsIgnoreCase("BGR")) { - Log.e(TAG, "Only BGR color format is supported."); - return false; - } - boolean isLoaded = init(appCtx, modelPath, labelPath); - if (!isLoaded) { - return false; - } - this.inputColorFormat = inputColorFormat; - this.inputShape = inputShape; - this.inputMean = inputMean; - this.inputStd = inputStd; - this.scoreThreshold = scoreThreshold; - return true; - } - - protected boolean loadModel(Context appCtx, String modelPath, int cpuThreadNum, String cpuPowerMode) { - // Release model if exists - releaseModel(); - - // Load model - if (modelPath.isEmpty()) { - return false; - } - String realPath = modelPath; - if (!modelPath.substring(0, 1).equals("/")) { - // Read model files from custom path if the first character of mode path is '/' - // otherwise copy model to cache from assets - realPath = appCtx.getCacheDir() + "/" + modelPath; - Utils.copyDirectoryFromAssets(appCtx, modelPath, realPath); - } - if (realPath.isEmpty()) { - return false; - } - - OCRPredictorNative.Config config = new OCRPredictorNative.Config(); - config.cpuThreadNum = cpuThreadNum; - config.detModelFilename = realPath + File.separator + "ch_det_mv3_db_opt.nb"; - config.recModelFilename = realPath + File.separator + "ch_rec_mv3_crnn_opt.nb"; - Log.e("Predictor", "model path" + config.detModelFilename + " ; " + config.recModelFilename); - config.cpuPower = cpuPowerMode; - paddlePredictor = new OCRPredictorNative(config); - - this.cpuThreadNum = cpuThreadNum; - this.cpuPowerMode = cpuPowerMode; - this.modelPath = realPath; - this.modelName = realPath.substring(realPath.lastIndexOf("/") + 1); - return true; - } - - public void releaseModel() { - if (paddlePredictor != null) { - paddlePredictor.release(); - paddlePredictor = null; - } - isLoaded = false; - cpuThreadNum = 1; - cpuPowerMode = "LITE_POWER_HIGH"; - modelPath = ""; - modelName = ""; - } - - protected boolean loadLabel(Context appCtx, String labelPath) { - wordLabels.clear(); - // Load word labels from file - try { - InputStream assetsInputStream = appCtx.getAssets().open(labelPath); - int available = assetsInputStream.available(); - byte[] lines = new byte[available]; - assetsInputStream.read(lines); - assetsInputStream.close(); - String words = new String(lines); - String[] contents = words.split("\n"); - for (String content : contents) { - wordLabels.add(content); - } - Log.i(TAG, "Word label size: " + wordLabels.size()); - } catch (Exception e) { - Log.e(TAG, e.getMessage()); - return false; - } - return true; - } - - - public boolean runModel() { - if (inputImage == null || !isLoaded()) { - return false; - } - - // Pre-process image, and feed input tensor with pre-processed data - - Bitmap scaleImage = Utils.resizeWithStep(inputImage, Long.valueOf(inputShape[2]).intValue(), 32); - - Date start = new Date(); - int channels = (int) inputShape[1]; - int width = scaleImage.getWidth(); - int height = scaleImage.getHeight(); - float[] inputData = new float[channels * width * height]; - if (channels == 3) { - int[] channelIdx = null; - if (inputColorFormat.equalsIgnoreCase("RGB")) { - channelIdx = new int[]{0, 1, 2}; - } else if (inputColorFormat.equalsIgnoreCase("BGR")) { - channelIdx = new int[]{2, 1, 0}; - } else { - Log.i(TAG, "Unknown color format " + inputColorFormat + ", only RGB and BGR color format is " + - "supported!"); - return false; - } - int[] channelStride = new int[]{width * height, width * height * 2}; - int p = scaleImage.getPixel(scaleImage.getWidth() - 1, scaleImage.getHeight() - 1); - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - int color = scaleImage.getPixel(x, y); - float[] rgb = new float[]{(float) red(color) / 255.0f, (float) green(color) / 255.0f, - (float) blue(color) / 255.0f}; - inputData[y * width + x] = (rgb[channelIdx[0]] - inputMean[0]) / inputStd[0]; - inputData[y * width + x + channelStride[0]] = (rgb[channelIdx[1]] - inputMean[1]) / inputStd[1]; - inputData[y * width + x + channelStride[1]] = (rgb[channelIdx[2]] - inputMean[2]) / inputStd[2]; - - } - } - } else if (channels == 1) { - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - int color = inputImage.getPixel(x, y); - float gray = (float) (red(color) + green(color) + blue(color)) / 3.0f / 255.0f; - inputData[y * width + x] = (gray - inputMean[0]) / inputStd[0]; - } - } - } else { - Log.i(TAG, "Unsupported channel size " + Integer.toString(channels) + ", only channel 1 and 3 is " + - "supported!"); - return false; - } - float[] pixels = inputData; - Log.i(TAG, "pixels " + pixels[0] + " " + pixels[1] + " " + pixels[2] + " " + pixels[3] - + " " + pixels[pixels.length / 2] + " " + pixels[pixels.length / 2 + 1] + " " + pixels[pixels.length - 2] + " " + pixels[pixels.length - 1]); - Date end = new Date(); - preprocessTime = (float) (end.getTime() - start.getTime()); - - // Warm up - for (int i = 0; i < warmupIterNum; i++) { - paddlePredictor.runImage(inputData, width, height, channels, inputImage); - } - warmupIterNum = 0; // do not need warm - // Run inference - start = new Date(); - ArrayList results = paddlePredictor.runImage(inputData, width, height, channels, inputImage); - end = new Date(); - inferenceTime = (end.getTime() - start.getTime()) / (float) inferIterNum; - - results = postprocess(results); - Log.i(TAG, "[stat] Preprocess Time: " + preprocessTime - + " ; Inference Time: " + inferenceTime + " ;Box Size " + results.size()); - drawResults(results); - - return true; - } - - - public boolean isLoaded() { - return paddlePredictor != null && isLoaded; - } - - public String modelPath() { - return modelPath; - } - - public String modelName() { - return modelName; - } - - public int cpuThreadNum() { - return cpuThreadNum; - } - - public String cpuPowerMode() { - return cpuPowerMode; - } - - public float inferenceTime() { - return inferenceTime; - } - - public Bitmap inputImage() { - return inputImage; - } - - public Bitmap outputImage() { - return outputImage; - } - - public String outputResult() { - return outputResult; - } - - public float preprocessTime() { - return preprocessTime; - } - - public float postprocessTime() { - return postprocessTime; - } - - - public void setInputImage(Bitmap image) { - if (image == null) { - return; - } - this.inputImage = image.copy(Bitmap.Config.ARGB_8888, true); - } - - private ArrayList postprocess(ArrayList results) { - for (OcrResultModel r : results) { - StringBuffer word = new StringBuffer(); - for (int index : r.getWordIndex()) { - if (index >= 0 && index < wordLabels.size()) { - word.append(wordLabels.get(index)); - } else { - Log.e(TAG, "Word index is not in label list:" + index); - word.append("×"); - } - } - r.setLabel(word.toString()); - } - return results; - } - - private void drawResults(ArrayList results) { - StringBuffer outputResultSb = new StringBuffer(""); - for (int i = 0; i < results.size(); i++) { - OcrResultModel result = results.get(i); - StringBuilder sb = new StringBuilder(""); - sb.append(result.getLabel()); - sb.append(" ").append(result.getConfidence()); - sb.append("; Points: "); - for (Point p : result.getPoints()) { - sb.append("(").append(p.x).append(",").append(p.y).append(") "); - } - Log.i(TAG, sb.toString()); // show LOG in Logcat panel - outputResultSb.append(i + 1).append(": ").append(result.getLabel()).append("\n"); - } - outputResult = outputResultSb.toString(); - outputImage = inputImage; - Canvas canvas = new Canvas(outputImage); - Paint paintFillAlpha = new Paint(); - paintFillAlpha.setStyle(Paint.Style.FILL); - paintFillAlpha.setColor(Color.parseColor("#3B85F5")); - paintFillAlpha.setAlpha(50); - - Paint paint = new Paint(); - paint.setColor(Color.parseColor("#3B85F5")); - paint.setStrokeWidth(5); - paint.setStyle(Paint.Style.STROKE); - - for (OcrResultModel result : results) { - Path path = new Path(); - List points = result.getPoints(); - path.moveTo(points.get(0).x, points.get(0).y); - for (int i = points.size() - 1; i >= 0; i--) { - Point p = points.get(i); - path.lineTo(p.x, p.y); - } - canvas.drawPath(path, paint); - canvas.drawPath(path, paintFillAlpha); - } - } - -} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java deleted file mode 100644 index b3653ccc..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; - -import androidx.appcompat.app.ActionBar; - -import java.util.ArrayList; -import java.util.List; - - -public class SettingsActivity extends AppCompatPreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { - ListPreference lpChoosePreInstalledModel = null; - CheckBoxPreference cbEnableCustomSettings = null; - EditTextPreference etModelPath = null; - EditTextPreference etLabelPath = null; - EditTextPreference etImagePath = null; - ListPreference lpCPUThreadNum = null; - ListPreference lpCPUPowerMode = null; - ListPreference lpInputColorFormat = null; - EditTextPreference etInputShape = null; - EditTextPreference etInputMean = null; - EditTextPreference etInputStd = null; - EditTextPreference etScoreThreshold = null; - - List preInstalledModelPaths = null; - List preInstalledLabelPaths = null; - List preInstalledImagePaths = null; - List preInstalledInputShapes = null; - List preInstalledCPUThreadNums = null; - List preInstalledCPUPowerModes = null; - List preInstalledInputColorFormats = null; - List preInstalledInputMeans = null; - List preInstalledInputStds = null; - List preInstalledScoreThresholds = null; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.settings); - ActionBar supportActionBar = getSupportActionBar(); - if (supportActionBar != null) { - supportActionBar.setDisplayHomeAsUpEnabled(true); - } - - // Initialized pre-installed models - preInstalledModelPaths = new ArrayList(); - preInstalledLabelPaths = new ArrayList(); - preInstalledImagePaths = new ArrayList(); - preInstalledInputShapes = new ArrayList(); - preInstalledCPUThreadNums = new ArrayList(); - preInstalledCPUPowerModes = new ArrayList(); - preInstalledInputColorFormats = new ArrayList(); - preInstalledInputMeans = new ArrayList(); - preInstalledInputStds = new ArrayList(); - preInstalledScoreThresholds = new ArrayList(); - // Add ssd_mobilenet_v1_pascalvoc_for_cpu - preInstalledModelPaths.add(getString(R.string.MODEL_PATH_DEFAULT)); - preInstalledLabelPaths.add(getString(R.string.LABEL_PATH_DEFAULT)); - preInstalledImagePaths.add(getString(R.string.IMAGE_PATH_DEFAULT)); - preInstalledCPUThreadNums.add(getString(R.string.CPU_THREAD_NUM_DEFAULT)); - preInstalledCPUPowerModes.add(getString(R.string.CPU_POWER_MODE_DEFAULT)); - preInstalledInputColorFormats.add(getString(R.string.INPUT_COLOR_FORMAT_DEFAULT)); - preInstalledInputShapes.add(getString(R.string.INPUT_SHAPE_DEFAULT)); - preInstalledInputMeans.add(getString(R.string.INPUT_MEAN_DEFAULT)); - preInstalledInputStds.add(getString(R.string.INPUT_STD_DEFAULT)); - preInstalledScoreThresholds.add(getString(R.string.SCORE_THRESHOLD_DEFAULT)); - - // Setup UI components - lpChoosePreInstalledModel = - (ListPreference) findPreference(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY)); - String[] preInstalledModelNames = new String[preInstalledModelPaths.size()]; - for (int i = 0; i < preInstalledModelPaths.size(); i++) { - preInstalledModelNames[i] = - preInstalledModelPaths.get(i).substring(preInstalledModelPaths.get(i).lastIndexOf("/") + 1); - } - lpChoosePreInstalledModel.setEntries(preInstalledModelNames); - lpChoosePreInstalledModel.setEntryValues(preInstalledModelPaths.toArray(new String[preInstalledModelPaths.size()])); - cbEnableCustomSettings = - (CheckBoxPreference) findPreference(getString(R.string.ENABLE_CUSTOM_SETTINGS_KEY)); - etModelPath = (EditTextPreference) findPreference(getString(R.string.MODEL_PATH_KEY)); - etModelPath.setTitle("Model Path (SDCard: " + Utils.getSDCardDirectory() + ")"); - etLabelPath = (EditTextPreference) findPreference(getString(R.string.LABEL_PATH_KEY)); - etImagePath = (EditTextPreference) findPreference(getString(R.string.IMAGE_PATH_KEY)); - lpCPUThreadNum = - (ListPreference) findPreference(getString(R.string.CPU_THREAD_NUM_KEY)); - lpCPUPowerMode = - (ListPreference) findPreference(getString(R.string.CPU_POWER_MODE_KEY)); - lpInputColorFormat = - (ListPreference) findPreference(getString(R.string.INPUT_COLOR_FORMAT_KEY)); - etInputShape = (EditTextPreference) findPreference(getString(R.string.INPUT_SHAPE_KEY)); - etInputMean = (EditTextPreference) findPreference(getString(R.string.INPUT_MEAN_KEY)); - etInputStd = (EditTextPreference) findPreference(getString(R.string.INPUT_STD_KEY)); - etScoreThreshold = (EditTextPreference) findPreference(getString(R.string.SCORE_THRESHOLD_KEY)); - } - - private void reloadPreferenceAndUpdateUI() { - SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences(); - boolean enableCustomSettings = - sharedPreferences.getBoolean(getString(R.string.ENABLE_CUSTOM_SETTINGS_KEY), false); - String modelPath = sharedPreferences.getString(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY), - getString(R.string.MODEL_PATH_DEFAULT)); - int modelIdx = lpChoosePreInstalledModel.findIndexOfValue(modelPath); - if (modelIdx >= 0 && modelIdx < preInstalledModelPaths.size()) { - if (!enableCustomSettings) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(getString(R.string.MODEL_PATH_KEY), preInstalledModelPaths.get(modelIdx)); - editor.putString(getString(R.string.LABEL_PATH_KEY), preInstalledLabelPaths.get(modelIdx)); - editor.putString(getString(R.string.IMAGE_PATH_KEY), preInstalledImagePaths.get(modelIdx)); - editor.putString(getString(R.string.CPU_THREAD_NUM_KEY), preInstalledCPUThreadNums.get(modelIdx)); - editor.putString(getString(R.string.CPU_POWER_MODE_KEY), preInstalledCPUPowerModes.get(modelIdx)); - editor.putString(getString(R.string.INPUT_COLOR_FORMAT_KEY), - preInstalledInputColorFormats.get(modelIdx)); - editor.putString(getString(R.string.INPUT_SHAPE_KEY), preInstalledInputShapes.get(modelIdx)); - editor.putString(getString(R.string.INPUT_MEAN_KEY), preInstalledInputMeans.get(modelIdx)); - editor.putString(getString(R.string.INPUT_STD_KEY), preInstalledInputStds.get(modelIdx)); - editor.putString(getString(R.string.SCORE_THRESHOLD_KEY), - preInstalledScoreThresholds.get(modelIdx)); - editor.commit(); - } - lpChoosePreInstalledModel.setSummary(modelPath); - } - cbEnableCustomSettings.setChecked(enableCustomSettings); - etModelPath.setEnabled(enableCustomSettings); - etLabelPath.setEnabled(enableCustomSettings); - etImagePath.setEnabled(enableCustomSettings); - lpCPUThreadNum.setEnabled(enableCustomSettings); - lpCPUPowerMode.setEnabled(enableCustomSettings); - lpInputColorFormat.setEnabled(enableCustomSettings); - etInputShape.setEnabled(enableCustomSettings); - etInputMean.setEnabled(enableCustomSettings); - etInputStd.setEnabled(enableCustomSettings); - etScoreThreshold.setEnabled(enableCustomSettings); - modelPath = sharedPreferences.getString(getString(R.string.MODEL_PATH_KEY), - getString(R.string.MODEL_PATH_DEFAULT)); - String labelPath = sharedPreferences.getString(getString(R.string.LABEL_PATH_KEY), - getString(R.string.LABEL_PATH_DEFAULT)); - String imagePath = sharedPreferences.getString(getString(R.string.IMAGE_PATH_KEY), - getString(R.string.IMAGE_PATH_DEFAULT)); - String cpuThreadNum = sharedPreferences.getString(getString(R.string.CPU_THREAD_NUM_KEY), - getString(R.string.CPU_THREAD_NUM_DEFAULT)); - String cpuPowerMode = sharedPreferences.getString(getString(R.string.CPU_POWER_MODE_KEY), - getString(R.string.CPU_POWER_MODE_DEFAULT)); - String inputColorFormat = sharedPreferences.getString(getString(R.string.INPUT_COLOR_FORMAT_KEY), - getString(R.string.INPUT_COLOR_FORMAT_DEFAULT)); - String inputShape = sharedPreferences.getString(getString(R.string.INPUT_SHAPE_KEY), - getString(R.string.INPUT_SHAPE_DEFAULT)); - String inputMean = sharedPreferences.getString(getString(R.string.INPUT_MEAN_KEY), - getString(R.string.INPUT_MEAN_DEFAULT)); - String inputStd = sharedPreferences.getString(getString(R.string.INPUT_STD_KEY), - getString(R.string.INPUT_STD_DEFAULT)); - String scoreThreshold = sharedPreferences.getString(getString(R.string.SCORE_THRESHOLD_KEY), - getString(R.string.SCORE_THRESHOLD_DEFAULT)); - etModelPath.setSummary(modelPath); - etModelPath.setText(modelPath); - etLabelPath.setSummary(labelPath); - etLabelPath.setText(labelPath); - etImagePath.setSummary(imagePath); - etImagePath.setText(imagePath); - lpCPUThreadNum.setValue(cpuThreadNum); - lpCPUThreadNum.setSummary(cpuThreadNum); - lpCPUPowerMode.setValue(cpuPowerMode); - lpCPUPowerMode.setSummary(cpuPowerMode); - lpInputColorFormat.setValue(inputColorFormat); - lpInputColorFormat.setSummary(inputColorFormat); - etInputShape.setSummary(inputShape); - etInputShape.setText(inputShape); - etInputMean.setSummary(inputMean); - etInputMean.setText(inputMean); - etInputStd.setSummary(inputStd); - etInputStd.setText(inputStd); - etScoreThreshold.setText(scoreThreshold); - etScoreThreshold.setSummary(scoreThreshold); - } - - @Override - protected void onResume() { - super.onResume(); - getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); - reloadPreferenceAndUpdateUI(); - } - - @Override - protected void onPause() { - super.onPause(); - getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (key.equals(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY))) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(getString(R.string.ENABLE_CUSTOM_SETTINGS_KEY), false); - editor.commit(); - } - reloadPreferenceAndUpdateUI(); - } -} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Utils.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Utils.java deleted file mode 100644 index ef468057..00000000 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Utils.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.baidu.paddle.lite.demo.ocr; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Matrix; -import android.media.ExifInterface; -import android.os.Environment; - -import java.io.*; - -public class Utils { - private static final String TAG = Utils.class.getSimpleName(); - - public static void copyFileFromAssets(Context appCtx, String srcPath, String dstPath) { - if (srcPath.isEmpty() || dstPath.isEmpty()) { - return; - } - InputStream is = null; - OutputStream os = null; - try { - is = new BufferedInputStream(appCtx.getAssets().open(srcPath)); - os = new BufferedOutputStream(new FileOutputStream(new File(dstPath))); - byte[] buffer = new byte[1024]; - int length = 0; - while ((length = is.read(buffer)) != -1) { - os.write(buffer, 0, length); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - os.close(); - is.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static void copyDirectoryFromAssets(Context appCtx, String srcDir, String dstDir) { - if (srcDir.isEmpty() || dstDir.isEmpty()) { - return; - } - try { - if (!new File(dstDir).exists()) { - new File(dstDir).mkdirs(); - } - for (String fileName : appCtx.getAssets().list(srcDir)) { - String srcSubPath = srcDir + File.separator + fileName; - String dstSubPath = dstDir + File.separator + fileName; - if (new File(srcSubPath).isDirectory()) { - copyDirectoryFromAssets(appCtx, srcSubPath, dstSubPath); - } else { - copyFileFromAssets(appCtx, srcSubPath, dstSubPath); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static float[] parseFloatsFromString(String string, String delimiter) { - String[] pieces = string.trim().toLowerCase().split(delimiter); - float[] floats = new float[pieces.length]; - for (int i = 0; i < pieces.length; i++) { - floats[i] = Float.parseFloat(pieces[i].trim()); - } - return floats; - } - - public static long[] parseLongsFromString(String string, String delimiter) { - String[] pieces = string.trim().toLowerCase().split(delimiter); - long[] longs = new long[pieces.length]; - for (int i = 0; i < pieces.length; i++) { - longs[i] = Long.parseLong(pieces[i].trim()); - } - return longs; - } - - public static String getSDCardDirectory() { - return Environment.getExternalStorageDirectory().getAbsolutePath(); - } - - public static boolean isSupportedNPU() { - return false; - // String hardware = android.os.Build.HARDWARE; - // return hardware.equalsIgnoreCase("kirin810") || hardware.equalsIgnoreCase("kirin990"); - } - - public static Bitmap resizeWithStep(Bitmap bitmap, int maxLength, int step) { - int width = bitmap.getWidth(); - int height = bitmap.getHeight(); - int maxWH = Math.max(width, height); - float ratio = 1; - int newWidth = width; - int newHeight = height; - if (maxWH > maxLength) { - ratio = maxLength * 1.0f / maxWH; - newWidth = (int) Math.floor(ratio * width); - newHeight = (int) Math.floor(ratio * height); - } - - newWidth = newWidth - newWidth % step; - if (newWidth == 0) { - newWidth = step; - } - newHeight = newHeight - newHeight % step; - if (newHeight == 0) { - newHeight = step; - } - return Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); - } - - public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) { - - Matrix matrix = new Matrix(); - switch (orientation) { - case ExifInterface.ORIENTATION_NORMAL: - return bitmap; - case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: - matrix.setScale(-1, 1); - break; - case ExifInterface.ORIENTATION_ROTATE_180: - matrix.setRotate(180); - break; - case ExifInterface.ORIENTATION_FLIP_VERTICAL: - matrix.setRotate(180); - matrix.postScale(-1, 1); - break; - case ExifInterface.ORIENTATION_TRANSPOSE: - matrix.setRotate(90); - matrix.postScale(-1, 1); - break; - case ExifInterface.ORIENTATION_ROTATE_90: - matrix.setRotate(90); - break; - case ExifInterface.ORIENTATION_TRANSVERSE: - matrix.setRotate(-90); - matrix.postScale(-1, 1); - break; - case ExifInterface.ORIENTATION_ROTATE_270: - matrix.setRotate(-90); - break; - default: - return bitmap; - } - try { - Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); - bitmap.recycle(); - return bmRotated; - } - catch (OutOfMemoryError e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/deploy/android_demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/deploy/android_demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 1f6bb290..00000000 --- a/deploy/android_demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/deploy/android_demo/app/src/main/res/drawable/ic_launcher_background.xml b/deploy/android_demo/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 0d025f9b..00000000 --- a/deploy/android_demo/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/deploy/android_demo/app/src/main/res/layout/activity_main.xml b/deploy/android_demo/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index adc70e20..00000000 --- a/deploy/android_demo/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/res/layout/activity_mini.xml b/deploy/android_demo/app/src/main/res/layout/activity_mini.xml deleted file mode 100644 index ec4622ae..00000000 --- a/deploy/android_demo/app/src/main/res/layout/activity_mini.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - -