1# Copyright (c) 2023 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6#     http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14if (defined(ohos_lite)) {
15  import("//build/lite/config/component/lite_component.gni")
16} else {
17  import("//build/ohos.gni")
18}
19
20declare_args() {
21  is_arm_ohos_clang_pc = (target_cpu == "arm" || target_cpu == "arm64") &&
22                         is_ohos && is_clang && target_platform == "pc"
23}
24
25action("libjpeg_action") {
26  script = "//third_party/libjpeg-turbo/install.py"
27  outputs = [
28    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcapimin.c",
29    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcapistd.c",
30    "${target_gen_dir}/libjpeg-turbo-2.1.1/jccoefct.c",
31    "${target_gen_dir}/libjpeg-turbo-2.1.1/jccolor.c",
32    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcdctmgr.c",
33    "${target_gen_dir}/libjpeg-turbo-2.1.1/jchuff.c",
34    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcicc.c",
35    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcinit.c",
36    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcmainct.c",
37    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcmarker.c",
38    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcmaster.c",
39    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcomapi.c",
40    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcparam.c",
41    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcphuff.c",
42    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcprepct.c",
43    "${target_gen_dir}/libjpeg-turbo-2.1.1/jcsample.c",
44    "${target_gen_dir}/libjpeg-turbo-2.1.1/jctrans.c",
45    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdapimin.c",
46    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdapistd.c",
47    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdatadst.c",
48    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdatasrc.c",
49    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdcoefct.c",
50    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdcolor.c",
51    "${target_gen_dir}/libjpeg-turbo-2.1.1/jddctmgr.c",
52    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdicc.c",
53    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdinput.c",
54    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdmainct.c",
55    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdmarker.c",
56    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdmaster.c",
57    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdmerge.c",
58    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdphuff.c",
59    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdpostct.c",
60    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdsample.c",
61    "${target_gen_dir}/libjpeg-turbo-2.1.1/jdtrans.c",
62    "${target_gen_dir}/libjpeg-turbo-2.1.1/jerror.c",
63    "${target_gen_dir}/libjpeg-turbo-2.1.1/jfdctflt.c",
64    "${target_gen_dir}/libjpeg-turbo-2.1.1/jfdctfst.c",
65    "${target_gen_dir}/libjpeg-turbo-2.1.1/jfdctint.c",
66    "${target_gen_dir}/libjpeg-turbo-2.1.1/jidctflt.c",
67    "${target_gen_dir}/libjpeg-turbo-2.1.1/jidctfst.c",
68    "${target_gen_dir}/libjpeg-turbo-2.1.1/jidctint.c",
69    "${target_gen_dir}/libjpeg-turbo-2.1.1/jidctred.c",
70    "${target_gen_dir}/libjpeg-turbo-2.1.1/jmemmgr.c",
71    "${target_gen_dir}/libjpeg-turbo-2.1.1/jmemnobs.c",
72    "${target_gen_dir}/libjpeg-turbo-2.1.1/jquant1.c",
73    "${target_gen_dir}/libjpeg-turbo-2.1.1/jquant2.c",
74    "${target_gen_dir}/libjpeg-turbo-2.1.1/jutils.c",
75  ]
76
77  if (is_arm_ohos_clang_pc) {
78    outputs += [ "${target_gen_dir}/libjpeg-turbo-2.1.1/jdhuff_opt.c" ]
79  } else {
80    outputs += [ "${target_gen_dir}/libjpeg-turbo-2.1.1/jdhuff.c" ]
81  }
82
83  mkernel = defined(ohos_kernel_type) && ohos_kernel_type == "liteos_m"
84  if (mkernel || is_win) {
85    outputs += [ "${target_gen_dir}/libjpeg-turbo-2.1.1/jsimd_none.c" ]
86  } else if (current_cpu == "arm" || current_cpu == "arm64") {
87    outputs += [
88      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jcgray-neon.c",
89      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jcphuff-neon.c",
90      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jcsample-neon.c",
91      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jdmerge-neon.c",
92      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jdsample-neon.c",
93      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jfdctfst-neon.c",
94      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jidctred-neon.c",
95      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jquanti-neon.c",
96    ]
97
98    # NEON_INTRINSICS as default
99    outputs += [
100      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jccolor-neon.c",
101      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jidctfst-neon.c",
102      "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jidctint-neon.c",
103    ]
104    if (current_cpu == "arm") {
105      outputs += [
106        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/aarch32/jchuff-neon.c",
107        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/aarch32/jsimd.c",
108        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jdcolor-neon.c",
109        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jfdctint-neon.c",
110      ]
111    } else {
112      outputs += [
113        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/aarch64/jchuff-neon.c",
114        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/aarch64/jsimd.c",
115        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jdcolor-neon.c",
116        "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm/jfdctint-neon.c",
117      ]
118    }
119  } else {
120    outputs += [ "${target_gen_dir}/libjpeg-turbo-2.1.1/jsimd_none.c" ]
121  }
122
123  if (!defined(ohos_lite)) {
124    outputs += [
125      # enable arith codec
126      "${target_gen_dir}/libjpeg-turbo-2.1.1/jaricom.c",
127      "${target_gen_dir}/libjpeg-turbo-2.1.1/jcarith.c",
128      "${target_gen_dir}/libjpeg-turbo-2.1.1/jdarith.c",
129      "${target_gen_dir}/libjpeg-turbo-2.1.1/jdatadst-tj.c",
130      "${target_gen_dir}/libjpeg-turbo-2.1.1/jdatasrc-tj.c",
131      "${target_gen_dir}/libjpeg-turbo-2.1.1/rdbmp.c",
132      "${target_gen_dir}/libjpeg-turbo-2.1.1/rdppm.c",
133      "${target_gen_dir}/libjpeg-turbo-2.1.1/transupp.c",
134
135      # enable turbo
136      "${target_gen_dir}/libjpeg-turbo-2.1.1/turbojpeg.c",
137      "${target_gen_dir}/libjpeg-turbo-2.1.1/wrbmp.c",
138      "${target_gen_dir}/libjpeg-turbo-2.1.1/wrppm.c",
139    ]
140  }
141
142  inputs = [ "//third_party/libjpeg-turbo/libjpeg-turbo-2.1.1.tar.gz" ]
143  libjpeg_path = rebase_path("${target_gen_dir}", root_build_dir)
144  libjpeg_source_path =
145      rebase_path("//third_party/libjpeg-turbo", root_build_dir)
146  args = [
147    "--gen-dir",
148    "$libjpeg_path",
149    "--source-dir",
150    "$libjpeg_source_path",
151  ]
152}
153
154include_dirs = []
155define_config = [ "HAVE_UNSIGNED_SHORT=1" ]
156cflags = []
157
158mkernel = defined(ohos_kernel_type) && ohos_kernel_type == "liteos_m"
159if (mkernel || is_win) {
160  define_config += [
161    "NO_PUTENV",
162    "NO_GETENV",
163  ]
164} else if (current_cpu == "arm" || current_cpu == "arm64") {
165  define_config += [ "NEON_INTRINSICS" ]
166  cflags += [
167    "-DNEON_INTRINSICS",
168    "-Wno-pointer-sign",
169  ]
170  include_dirs += [ "${target_gen_dir}/libjpeg-turbo-2.1.1/simd/arm" ]
171  if (current_cpu == "arm") {
172    cflags += [
173      "-mfpu=neon",
174      "-mfloat-abi=softfp",
175    ]
176  }
177}
178
179if (!defined(ohos_lite)) {
180  define_config += [
181    "C_ARITH_CODING_SUPPORTED=1",  #Support arithmetic encoding
182    "D_ARITH_CODING_SUPPORTED=1",  #Support arithmetic decoding
183    "BMP_SUPPORTED=1",  #Support arithmetic decoding
184    "PPM_SUPPORTED=1",  #Support arithmetic decoding
185  ]
186}
187
188config("turbojpeg_config") {
189  include_dirs += [ "${target_gen_dir}/libjpeg-turbo-2.1.1" ]
190  defines = define_config
191}
192
193if (defined(ohos_lite)) {
194  lite_library("libjpeg") {
195    if (ohos_kernel_type == "liteos_m") {
196      target_type = "static_library"
197    } else {
198      target_type = "shared_library"
199    }
200    sources = get_target_outputs(":libjpeg_action")
201    deps = [ ":libjpeg_action" ]
202    public_configs = [ ":turbojpeg_config" ]
203    if (defined(board_toolchain_type) && board_toolchain_type == "iccarm") {
204      cflags += [
205        "-DHAVE_STDLIB_H",
206        "--diag_suppress",
207        "Pa181,Pe301,Pe546",
208      ]
209      cflags_cc = cflags
210    }
211  }
212} else {
213  ohos_static_library("turbojpeg_static") {
214    sources = get_target_outputs(":libjpeg_action")
215    public_configs = [ ":turbojpeg_config" ]
216    deps = [ ":libjpeg_action" ]
217    part_name = "libjpeg-turbo"
218    subsystem_name = "thirdparty"
219    if (is_arm_ohos_clang_pc) {
220      defines = [ "HUFF_DECODE_OPT" ]
221      cflags += [ "-fvisibility=hidden" ]
222    }
223  }
224  ohos_shared_library("turbojpeg") {
225    sources = get_target_outputs(":libjpeg_action")
226    public_configs = [ ":turbojpeg_config" ]
227    deps = [ ":libjpeg_action" ]
228    innerapi_tags = [ "platformsdk" ]
229    part_name = "libjpeg-turbo"
230    subsystem_name = "thirdparty"
231    if (is_arm_ohos_clang_pc) {
232      defines = [
233        "HUFF_DECODE_OPT",
234        "HIDE_INTERNAL",
235      ]
236      ldflags = [ "-Wl,-Bsymbolic" ]
237    }
238  }
239}
240