// Copyright 2020 Google LLC // // 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 "lcms2.h" extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { cmsHPROFILE srcProfile = cmsOpenProfileFromMem(data, size); if (!srcProfile) return 0; cmsHPROFILE dstProfile = cmsCreate_sRGBProfile(); if (!dstProfile) { cmsCloseProfile(srcProfile); return 0; } cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile); cmsUInt32Number nSrcComponents = cmsChannelsOf(srcCS); cmsUInt32Number srcFormat; if (srcCS == cmsSigLabData) { srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); } else { srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1); } cmsUInt32Number intent = 0; cmsUInt32Number flags = 0; cmsHTRANSFORM hTransform = cmsCreateTransform( srcProfile, srcFormat, dstProfile, TYPE_BGR_8, intent, flags); cmsCloseProfile(srcProfile); cmsCloseProfile(dstProfile); if (!hTransform) return 0; uint8_t output[4]; if (T_BYTES(srcFormat) == 0) { // 0 means double double input[nSrcComponents]; for (uint32_t i = 0; i < nSrcComponents; i++) input[i] = 0.5f; cmsDoTransform(hTransform, input, output, 1); } else { uint8_t input[nSrcComponents]; for (uint32_t i = 0; i < nSrcComponents; i++) input[i] = 128; cmsDoTransform(hTransform, input, output, 1); } cmsDeleteTransform(hTransform); return 0; }