@shopify/react-native-skia 0.1.233 → 0.1.236

Sign up to get free protection for your applications and to get access to all the features.
Files changed (294) hide show
  1. package/android/CMakeLists.txt +0 -1
  2. package/android/cpp/jni/JniSkiaManager.cpp +0 -1
  3. package/android/cpp/rnskia-android/RNSkAndroidView.h +0 -1
  4. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +1 -1
  5. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +1 -2
  6. package/cpp/api/JsiSkTypefaceFactory.h +2 -1
  7. package/cpp/skia/include/android/AHardwareBufferUtils.h +23 -0
  8. package/cpp/skia/include/android/GrAHardwareBufferUtils.h +2 -0
  9. package/cpp/skia/include/android/graphite/SurfaceAndroid.h +59 -0
  10. package/cpp/skia/include/codec/SkAvifDecoder.h +1 -1
  11. package/cpp/skia/include/codec/SkBmpDecoder.h +1 -1
  12. package/cpp/skia/include/codec/SkCodec.h +21 -3
  13. package/cpp/skia/include/codec/SkGifDecoder.h +1 -1
  14. package/cpp/skia/include/codec/SkIcoDecoder.h +1 -1
  15. package/cpp/skia/include/codec/SkJpegDecoder.h +1 -1
  16. package/cpp/skia/include/codec/SkJpegxlDecoder.h +1 -1
  17. package/cpp/skia/include/codec/SkPngDecoder.h +1 -1
  18. package/cpp/skia/include/codec/SkRawDecoder.h +1 -1
  19. package/cpp/skia/include/codec/SkWbmpDecoder.h +1 -1
  20. package/cpp/skia/include/codec/SkWebpDecoder.h +1 -1
  21. package/cpp/skia/include/config/SkUserConfig.h +3 -1
  22. package/cpp/skia/include/core/SkCanvas.h +66 -37
  23. package/cpp/skia/include/core/SkColorFilter.h +5 -2
  24. package/cpp/skia/include/core/SkContourMeasure.h +1 -0
  25. package/cpp/skia/include/core/SkDocument.h +1 -0
  26. package/cpp/skia/include/core/SkFont.h +14 -24
  27. package/cpp/skia/include/core/SkFontArguments.h +1 -1
  28. package/cpp/skia/include/core/SkFontMetrics.h +1 -1
  29. package/cpp/skia/include/core/SkFontMgr.h +0 -7
  30. package/cpp/skia/include/core/SkGraphics.h +13 -0
  31. package/cpp/skia/include/core/SkMesh.h +9 -13
  32. package/cpp/skia/include/core/SkMilestone.h +1 -1
  33. package/cpp/skia/include/core/SkPathMeasure.h +2 -0
  34. package/cpp/skia/include/core/SkSerialProcs.h +29 -11
  35. package/cpp/skia/include/core/SkSize.h +3 -3
  36. package/cpp/skia/include/core/SkStream.h +3 -13
  37. package/cpp/skia/include/core/SkSurface.h +6 -3
  38. package/cpp/skia/include/core/SkSurfaceProps.h +2 -4
  39. package/cpp/skia/include/core/SkTraceMemoryDump.h +15 -0
  40. package/cpp/skia/include/core/SkTypeface.h +8 -56
  41. package/cpp/skia/include/core/SkTypes.h +8 -0
  42. package/cpp/skia/include/core/SkVertices.h +1 -1
  43. package/cpp/skia/include/docs/SkMultiPictureDocument.h +53 -0
  44. package/cpp/skia/include/docs/SkPDFDocument.h +11 -0
  45. package/cpp/skia/include/effects/SkGradientShader.h +9 -0
  46. package/cpp/skia/include/effects/SkRuntimeEffect.h +3 -7
  47. package/cpp/skia/include/gpu/GrBackendSemaphore.h +33 -47
  48. package/cpp/skia/include/gpu/GrBackendSurface.h +2 -3
  49. package/cpp/skia/include/gpu/GrContextOptions.h +0 -6
  50. package/cpp/skia/include/gpu/GrContextThreadSafeProxy.h +44 -28
  51. package/cpp/skia/include/gpu/GrDirectContext.h +12 -31
  52. package/cpp/skia/include/gpu/GrTypes.h +1 -16
  53. package/cpp/skia/include/gpu/MutableTextureState.h +35 -80
  54. package/cpp/skia/include/gpu/ShaderErrorHandler.h +11 -1
  55. package/cpp/skia/include/gpu/ganesh/SkImageGanesh.h +2 -2
  56. package/cpp/skia/include/gpu/ganesh/SkSurfaceGanesh.h +1 -1
  57. package/cpp/skia/include/gpu/ganesh/gl/GrGLDirectContext.h +3 -2
  58. package/cpp/skia/include/gpu/ganesh/vk/GrVkBackendSemaphore.h +20 -0
  59. package/cpp/skia/include/gpu/ganesh/vk/GrVkDirectContext.h +30 -0
  60. package/cpp/skia/include/gpu/gl/GrGLFunctions.h +1 -1
  61. package/cpp/skia/include/gpu/gl/GrGLInterface.h +2 -0
  62. package/cpp/skia/include/gpu/gl/glx/GrGLMakeGLXInterface.h +6 -0
  63. package/cpp/skia/include/gpu/graphite/BackendSemaphore.h +3 -3
  64. package/cpp/skia/include/gpu/graphite/BackendTexture.h +39 -27
  65. package/cpp/skia/include/gpu/graphite/Context.h +39 -13
  66. package/cpp/skia/include/gpu/graphite/ContextOptions.h +2 -0
  67. package/cpp/skia/include/gpu/graphite/GraphiteTypes.h +2 -1
  68. package/cpp/skia/include/gpu/graphite/Image.h +106 -87
  69. package/cpp/skia/include/gpu/graphite/Recorder.h +24 -3
  70. package/cpp/skia/include/gpu/graphite/Surface.h +7 -2
  71. package/cpp/skia/include/gpu/graphite/dawn/DawnBackendContext.h +41 -2
  72. package/cpp/skia/include/gpu/graphite/dawn/DawnTypes.h +11 -6
  73. package/cpp/skia/include/gpu/graphite/mtl/MtlGraphiteTypes.h +1 -2
  74. package/cpp/skia/include/gpu/graphite/vk/VulkanGraphiteTypes.h +6 -6
  75. package/cpp/skia/include/gpu/mock/GrMockTypes.h +1 -0
  76. package/cpp/skia/include/gpu/vk/GrVkBackendContext.h +1 -1
  77. package/cpp/skia/include/gpu/vk/GrVkTypes.h +1 -44
  78. package/cpp/skia/include/gpu/vk/VulkanExtensions.h +1 -1
  79. package/cpp/skia/include/gpu/vk/VulkanMutableTextureState.h +25 -0
  80. package/cpp/skia/include/gpu/vk/VulkanTypes.h +44 -0
  81. package/cpp/skia/include/ports/SkFontConfigInterface.h +3 -6
  82. package/cpp/skia/include/private/SkEncodedInfo.h +5 -0
  83. package/cpp/skia/include/private/SkExif.h +102 -0
  84. package/cpp/skia/include/private/SkGainmapInfo.h +11 -1
  85. package/cpp/skia/include/private/base/SkAssert.h +16 -0
  86. package/cpp/skia/include/private/base/SkDeque.h +2 -7
  87. package/cpp/skia/include/private/base/SkLoadUserConfig.h +1 -1
  88. package/cpp/skia/include/private/base/SkTArray.h +69 -28
  89. package/cpp/skia/include/private/base/SkThreadAnnotations.h +18 -5
  90. package/cpp/skia/include/private/chromium/GrSurfaceCharacterization.h +26 -30
  91. package/cpp/skia/include/private/chromium/GrVkSecondaryCBDrawContext.h +4 -3
  92. package/cpp/skia/include/private/chromium/SkImageChromium.h +1 -1
  93. package/cpp/skia/include/private/gpu/ganesh/GrTypesPriv.h +8 -6
  94. package/cpp/skia/include/private/gpu/graphite/ContextOptionsPriv.h +29 -0
  95. package/cpp/skia/include/private/gpu/graphite/DawnTypesPriv.h +12 -9
  96. package/cpp/skia/include/private/gpu/graphite/VulkanGraphiteTypesPriv.h +16 -11
  97. package/cpp/skia/include/third_party/vulkan/vulkan/vk_platform.h +2 -2
  98. package/cpp/skia/include/third_party/vulkan/vulkan/vk_video/vulkan_video_codec_h264std.h +312 -0
  99. package/cpp/skia/include/third_party/vulkan/vulkan/vk_video/vulkan_video_codec_h264std_decode.h +77 -0
  100. package/cpp/skia/include/third_party/vulkan/vulkan/vk_video/vulkan_video_codec_h265std.h +446 -0
  101. package/cpp/skia/include/third_party/vulkan/vulkan/vk_video/vulkan_video_codec_h265std_decode.h +67 -0
  102. package/cpp/skia/include/third_party/vulkan/vulkan/vk_video/vulkan_video_codecs_common.h +36 -0
  103. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan.h +9 -2
  104. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_android.h +31 -3
  105. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_core.h +10624 -5716
  106. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_ios.h +2 -1
  107. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_macos.h +2 -1
  108. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_win32.h +28 -1
  109. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_xcb.h +2 -1
  110. package/cpp/skia/include/utils/mac/SkCGUtils.h +23 -11
  111. package/cpp/skia/modules/skcms/skcms.h +2 -410
  112. package/cpp/skia/modules/skcms/src/Transform_inl.h +831 -704
  113. package/cpp/skia/modules/skcms/src/skcms_Transform.h +161 -0
  114. package/cpp/skia/modules/skcms/src/skcms_internals.h +136 -0
  115. package/cpp/skia/modules/skcms/src/skcms_public.h +404 -0
  116. package/cpp/skia/modules/skparagraph/include/FontArguments.h +1 -1
  117. package/cpp/skia/modules/skparagraph/include/FontCollection.h +2 -0
  118. package/cpp/skia/modules/skparagraph/include/Paragraph.h +2 -2
  119. package/cpp/skia/modules/skparagraph/include/TextStyle.h +4 -3
  120. package/cpp/skia/modules/skparagraph/include/TypefaceFontProvider.h +1 -3
  121. package/cpp/skia/modules/skresources/include/SkResources.h +28 -17
  122. package/cpp/skia/modules/skunicode/include/SkUnicode.h +12 -0
  123. package/cpp/skia/modules/svg/include/SkSVGDOM.h +4 -1
  124. package/cpp/skia/modules/svg/include/SkSVGRenderContext.h +4 -1
  125. package/cpp/skia/src/base/SkUTF.h +7 -0
  126. package/cpp/skia/src/core/SkTHash.h +20 -8
  127. package/lib/commonjs/dom/nodes/JsiSkDOM.d.ts +3 -2
  128. package/lib/commonjs/dom/nodes/JsiSkDOM.js +56 -57
  129. package/lib/commonjs/dom/nodes/JsiSkDOM.js.map +1 -1
  130. package/lib/commonjs/external/reanimated/index.d.ts +1 -0
  131. package/lib/commonjs/external/reanimated/index.js +13 -0
  132. package/lib/commonjs/external/reanimated/index.js.map +1 -1
  133. package/lib/commonjs/external/reanimated/interpolators.js +16 -2
  134. package/lib/commonjs/external/reanimated/interpolators.js.map +1 -1
  135. package/lib/commonjs/external/reanimated/moduleWrapper.d.ts +1 -0
  136. package/lib/commonjs/external/reanimated/moduleWrapper.js +5 -3
  137. package/lib/commonjs/external/reanimated/moduleWrapper.js.map +1 -1
  138. package/lib/commonjs/external/reanimated/textures.d.ts +5 -0
  139. package/lib/commonjs/external/reanimated/textures.js +52 -0
  140. package/lib/commonjs/external/reanimated/textures.js.map +1 -0
  141. package/lib/commonjs/headless/index.js +1 -1
  142. package/lib/commonjs/headless/index.js.map +1 -1
  143. package/lib/commonjs/mock/index.js +3 -0
  144. package/lib/commonjs/mock/index.js.map +1 -1
  145. package/lib/commonjs/renderer/Canvas.js +6 -5
  146. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  147. package/lib/commonjs/renderer/Container.d.ts +1 -1
  148. package/lib/commonjs/renderer/Container.js +2 -1
  149. package/lib/commonjs/renderer/Container.js.map +1 -1
  150. package/lib/commonjs/renderer/Offscreen.d.ts +1 -0
  151. package/lib/commonjs/renderer/Offscreen.js +18 -5
  152. package/lib/commonjs/renderer/Offscreen.js.map +1 -1
  153. package/lib/commonjs/renderer/Reconciler.d.ts +1 -1
  154. package/lib/commonjs/renderer/Reconciler.js +7 -4
  155. package/lib/commonjs/renderer/Reconciler.js.map +1 -1
  156. package/lib/commonjs/skia/types/Matrix4.d.ts +2 -2
  157. package/lib/commonjs/skia/types/Matrix4.js.map +1 -1
  158. package/lib/commonjs/skia/types/Shader/Shader.d.ts +1 -1
  159. package/lib/commonjs/skia/types/Shader/Shader.js.map +1 -1
  160. package/lib/commonjs/skia/web/JsiSkPath.d.ts +2 -2
  161. package/lib/commonjs/skia/web/JsiSkPath.js +10 -2
  162. package/lib/commonjs/skia/web/JsiSkPath.js.map +1 -1
  163. package/lib/commonjs/views/SkiaJSDomView.d.ts +31 -0
  164. package/lib/commonjs/views/SkiaJSDomView.js +161 -0
  165. package/lib/commonjs/views/SkiaJSDomView.js.map +1 -0
  166. package/lib/commonjs/views/SkiaJSDomView.web.d.ts +1 -0
  167. package/lib/commonjs/views/SkiaJSDomView.web.js +14 -0
  168. package/lib/commonjs/views/SkiaJSDomView.web.js.map +1 -0
  169. package/lib/module/dom/nodes/JsiSkDOM.d.ts +3 -2
  170. package/lib/module/dom/nodes/JsiSkDOM.js +56 -56
  171. package/lib/module/dom/nodes/JsiSkDOM.js.map +1 -1
  172. package/lib/module/external/reanimated/index.d.ts +1 -0
  173. package/lib/module/external/reanimated/index.js +1 -0
  174. package/lib/module/external/reanimated/index.js.map +1 -1
  175. package/lib/module/external/reanimated/interpolators.js +15 -2
  176. package/lib/module/external/reanimated/interpolators.js.map +1 -1
  177. package/lib/module/external/reanimated/moduleWrapper.d.ts +1 -0
  178. package/lib/module/external/reanimated/moduleWrapper.js +3 -2
  179. package/lib/module/external/reanimated/moduleWrapper.js.map +1 -1
  180. package/lib/module/external/reanimated/textures.d.ts +5 -0
  181. package/lib/module/external/reanimated/textures.js +35 -0
  182. package/lib/module/external/reanimated/textures.js.map +1 -0
  183. package/lib/module/headless/index.js +1 -1
  184. package/lib/module/headless/index.js.map +1 -1
  185. package/lib/module/mock/index.js +3 -0
  186. package/lib/module/mock/index.js.map +1 -1
  187. package/lib/module/renderer/Canvas.js +5 -4
  188. package/lib/module/renderer/Canvas.js.map +1 -1
  189. package/lib/module/renderer/Container.d.ts +1 -1
  190. package/lib/module/renderer/Container.js +2 -1
  191. package/lib/module/renderer/Container.js.map +1 -1
  192. package/lib/module/renderer/Offscreen.d.ts +1 -0
  193. package/lib/module/renderer/Offscreen.js +11 -3
  194. package/lib/module/renderer/Offscreen.js.map +1 -1
  195. package/lib/module/renderer/Reconciler.d.ts +1 -1
  196. package/lib/module/renderer/Reconciler.js +7 -4
  197. package/lib/module/renderer/Reconciler.js.map +1 -1
  198. package/lib/module/skia/types/Matrix4.d.ts +2 -2
  199. package/lib/module/skia/types/Matrix4.js.map +1 -1
  200. package/lib/module/skia/types/Shader/Shader.d.ts +1 -1
  201. package/lib/module/skia/types/Shader/Shader.js.map +1 -1
  202. package/lib/module/skia/web/JsiSkPath.d.ts +2 -2
  203. package/lib/module/skia/web/JsiSkPath.js +10 -2
  204. package/lib/module/skia/web/JsiSkPath.js.map +1 -1
  205. package/lib/module/views/SkiaJSDomView.d.ts +31 -0
  206. package/lib/module/views/SkiaJSDomView.js +136 -0
  207. package/lib/module/views/SkiaJSDomView.js.map +1 -0
  208. package/lib/module/views/SkiaJSDomView.web.d.ts +1 -0
  209. package/lib/module/views/SkiaJSDomView.web.js +2 -0
  210. package/lib/module/views/SkiaJSDomView.web.js.map +1 -0
  211. package/lib/typescript/src/dom/nodes/JsiSkDOM.d.ts +3 -2
  212. package/lib/typescript/src/external/reanimated/index.d.ts +1 -0
  213. package/lib/typescript/src/external/reanimated/moduleWrapper.d.ts +1 -0
  214. package/lib/typescript/src/external/reanimated/textures.d.ts +5 -0
  215. package/lib/typescript/src/renderer/Container.d.ts +1 -1
  216. package/lib/typescript/src/renderer/Offscreen.d.ts +1 -0
  217. package/lib/typescript/src/renderer/Reconciler.d.ts +1 -1
  218. package/lib/typescript/src/skia/types/Matrix4.d.ts +2 -2
  219. package/lib/typescript/src/skia/types/Shader/Shader.d.ts +1 -1
  220. package/lib/typescript/src/skia/web/JsiSkPath.d.ts +2 -2
  221. package/lib/typescript/src/views/SkiaJSDomView.d.ts +31 -0
  222. package/lib/typescript/src/views/SkiaJSDomView.web.d.ts +1 -0
  223. package/libs/android/arm64-v8a/libskia.a +0 -0
  224. package/libs/android/arm64-v8a/libskottie.a +0 -0
  225. package/libs/android/arm64-v8a/libskparagraph.a +0 -0
  226. package/libs/android/arm64-v8a/libsksg.a +0 -0
  227. package/libs/android/arm64-v8a/libskshaper.a +0 -0
  228. package/libs/android/arm64-v8a/libskunicode.a +0 -0
  229. package/libs/android/arm64-v8a/libsvg.a +0 -0
  230. package/libs/android/armeabi-v7a/libskia.a +0 -0
  231. package/libs/android/armeabi-v7a/libskottie.a +0 -0
  232. package/libs/android/armeabi-v7a/libskparagraph.a +0 -0
  233. package/libs/android/armeabi-v7a/libsksg.a +0 -0
  234. package/libs/android/armeabi-v7a/libskshaper.a +0 -0
  235. package/libs/android/armeabi-v7a/libskunicode.a +0 -0
  236. package/libs/android/armeabi-v7a/libsvg.a +0 -0
  237. package/libs/android/x86/libskia.a +0 -0
  238. package/libs/android/x86/libskottie.a +0 -0
  239. package/libs/android/x86/libskparagraph.a +0 -0
  240. package/libs/android/x86/libsksg.a +0 -0
  241. package/libs/android/x86/libskshaper.a +0 -0
  242. package/libs/android/x86/libskunicode.a +0 -0
  243. package/libs/android/x86/libsvg.a +0 -0
  244. package/libs/android/x86_64/libskia.a +0 -0
  245. package/libs/android/x86_64/libskottie.a +0 -0
  246. package/libs/android/x86_64/libskparagraph.a +0 -0
  247. package/libs/android/x86_64/libsksg.a +0 -0
  248. package/libs/android/x86_64/libskshaper.a +0 -0
  249. package/libs/android/x86_64/libskunicode.a +0 -0
  250. package/libs/android/x86_64/libsvg.a +0 -0
  251. package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
  252. package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
  253. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
  254. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
  255. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
  256. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
  257. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
  258. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
  259. package/libs/ios/libskshaper.xcframework/Info.plist +5 -5
  260. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
  261. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
  262. package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e/libskunicode.a +0 -0
  263. package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode.a +0 -0
  264. package/libs/ios/libsvg.xcframework/Info.plist +5 -5
  265. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
  266. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
  267. package/package.json +1 -1
  268. package/src/dom/nodes/JsiSkDOM.ts +55 -56
  269. package/src/external/reanimated/index.ts +1 -0
  270. package/src/external/reanimated/interpolators.ts +17 -3
  271. package/src/external/reanimated/moduleWrapper.ts +1 -0
  272. package/src/external/reanimated/textures.tsx +50 -0
  273. package/src/headless/index.ts +1 -1
  274. package/src/mock/index.ts +3 -0
  275. package/src/renderer/Canvas.tsx +4 -3
  276. package/src/renderer/Container.tsx +3 -2
  277. package/src/renderer/Offscreen.tsx +12 -3
  278. package/src/renderer/Reconciler.tsx +5 -2
  279. package/src/skia/types/Matrix4.ts +2 -2
  280. package/src/skia/types/Shader/Shader.ts +6 -1
  281. package/src/skia/web/JsiSkPath.ts +23 -3
  282. package/src/views/SkiaJSDomView.tsx +126 -0
  283. package/src/views/SkiaJSDomView.web.tsx +1 -0
  284. package/android/cpp/jni/include/JniSkiaDrawView.h +0 -90
  285. package/cpp/rnskia/RNSkJsView.cpp +0 -236
  286. package/cpp/rnskia/RNSkJsView.h +0 -121
  287. package/cpp/skia/include/gpu/GrSurfaceInfo.h +0 -142
  288. package/cpp/skia/include/private/gpu/ganesh/GrGLTypesPriv.h +0 -107
  289. package/cpp/skia/include/private/gpu/ganesh/GrMockTypesPriv.h +0 -32
  290. package/cpp/skia/include/private/gpu/ganesh/GrMtlTypesPriv.h +0 -83
  291. package/cpp/skia/include/private/gpu/ganesh/GrVkTypesPriv.h +0 -47
  292. package/cpp/skia/include/private/gpu/vk/VulkanTypesPriv.h +0 -57
  293. package/cpp/skia/include/utils/SkBase64.h +0 -53
  294. package/cpp/skia/modules/skcms/skcms_internal.h +0 -56
@@ -0,0 +1,161 @@
1
+ /*
2
+ * Copyright 2018 Google LLC
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <stddef.h>
11
+ #include <stdint.h>
12
+
13
+ // skcms_Transform.h contains skcms implementation details.
14
+ // Please don't use this header from outside the skcms repo.
15
+
16
+ namespace skcms_private {
17
+
18
+ /** All transform ops */
19
+
20
+ #define SKCMS_WORK_OPS(M) \
21
+ M(load_a8) \
22
+ M(load_g8) \
23
+ M(load_4444) \
24
+ M(load_565) \
25
+ M(load_888) \
26
+ M(load_8888) \
27
+ M(load_1010102) \
28
+ M(load_101010x_XR) \
29
+ M(load_161616LE) \
30
+ M(load_16161616LE) \
31
+ M(load_161616BE) \
32
+ M(load_16161616BE) \
33
+ M(load_hhh) \
34
+ M(load_hhhh) \
35
+ M(load_fff) \
36
+ M(load_ffff) \
37
+ \
38
+ M(swap_rb) \
39
+ M(clamp) \
40
+ M(invert) \
41
+ M(force_opaque) \
42
+ M(premul) \
43
+ M(unpremul) \
44
+ M(matrix_3x3) \
45
+ M(matrix_3x4) \
46
+ \
47
+ M(lab_to_xyz) \
48
+ M(xyz_to_lab) \
49
+ \
50
+ M(gamma_r) \
51
+ M(gamma_g) \
52
+ M(gamma_b) \
53
+ M(gamma_a) \
54
+ M(gamma_rgb) \
55
+ \
56
+ M(tf_r) \
57
+ M(tf_g) \
58
+ M(tf_b) \
59
+ M(tf_a) \
60
+ M(tf_rgb) \
61
+ \
62
+ M(pq_r) \
63
+ M(pq_g) \
64
+ M(pq_b) \
65
+ M(pq_a) \
66
+ M(pq_rgb) \
67
+ \
68
+ M(hlg_r) \
69
+ M(hlg_g) \
70
+ M(hlg_b) \
71
+ M(hlg_a) \
72
+ M(hlg_rgb) \
73
+ \
74
+ M(hlginv_r) \
75
+ M(hlginv_g) \
76
+ M(hlginv_b) \
77
+ M(hlginv_a) \
78
+ M(hlginv_rgb) \
79
+ \
80
+ M(table_r) \
81
+ M(table_g) \
82
+ M(table_b) \
83
+ M(table_a) \
84
+ \
85
+ M(clut_A2B) \
86
+ M(clut_B2A)
87
+
88
+ #define SKCMS_STORE_OPS(M) \
89
+ M(store_a8) \
90
+ M(store_g8) \
91
+ M(store_4444) \
92
+ M(store_565) \
93
+ M(store_888) \
94
+ M(store_8888) \
95
+ M(store_1010102) \
96
+ M(store_161616LE) \
97
+ M(store_16161616LE) \
98
+ M(store_161616BE) \
99
+ M(store_16161616BE) \
100
+ M(store_101010x_XR) \
101
+ M(store_hhh) \
102
+ M(store_hhhh) \
103
+ M(store_fff) \
104
+ M(store_ffff)
105
+
106
+ enum class Op : int {
107
+ #define M(op) op,
108
+ SKCMS_WORK_OPS(M)
109
+ SKCMS_STORE_OPS(M)
110
+ #undef M
111
+ };
112
+
113
+ /** Constants */
114
+
115
+ #if defined(__clang__) || defined(__GNUC__)
116
+ static constexpr float INFINITY_ = __builtin_inff();
117
+ #else
118
+ static const union {
119
+ uint32_t bits;
120
+ float f;
121
+ } inf_ = { 0x7f800000 };
122
+ #define INFINITY_ inf_.f
123
+ #endif
124
+
125
+ /** Vector type */
126
+
127
+ #if defined(__clang__)
128
+ template <int N, typename T> using Vec = T __attribute__((ext_vector_type(N)));
129
+ #elif defined(__GNUC__)
130
+ // Unfortunately, GCC does not allow us to omit the struct. This will not compile:
131
+ // template <int N, typename T> using Vec = T __attribute__((vector_size(N*sizeof(T))));
132
+ template <int N, typename T> struct VecHelper {
133
+ typedef T __attribute__((vector_size(N * sizeof(T)))) V;
134
+ };
135
+ template <int N, typename T> using Vec = typename VecHelper<N, T>::V;
136
+ #endif
137
+
138
+ /** Interface */
139
+
140
+ namespace baseline {
141
+
142
+ void run_program(const Op* program, const void** contexts, ptrdiff_t programSize,
143
+ const char* src, char* dst, int n,
144
+ const size_t src_bpp, const size_t dst_bpp);
145
+
146
+ }
147
+ namespace hsw {
148
+
149
+ void run_program(const Op* program, const void** contexts, ptrdiff_t programSize,
150
+ const char* src, char* dst, int n,
151
+ const size_t src_bpp, const size_t dst_bpp);
152
+
153
+ }
154
+ namespace skx {
155
+
156
+ void run_program(const Op* program, const void** contexts, ptrdiff_t programSize,
157
+ const char* src, char* dst, int n,
158
+ const size_t src_bpp, const size_t dst_bpp);
159
+
160
+ }
161
+ } // namespace skcms_private
@@ -0,0 +1,136 @@
1
+ /*
2
+ * Copyright 2018 Google Inc.
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ // skcms_internals.h contains APIs shared by skcms' internals and its test tools.
11
+ // Please don't use this header from outside the skcms repo.
12
+
13
+ #include <stdbool.h>
14
+ #include <stdint.h>
15
+
16
+ #ifdef __cplusplus
17
+ extern "C" {
18
+ #endif
19
+
20
+ // ~~~~ General Helper Macros ~~~~
21
+ // skcms can leverage some C++ extensions when they are present.
22
+ #define ARRAY_COUNT(arr) (int)(sizeof((arr)) / sizeof(*(arr)))
23
+
24
+ #if defined(__clang__) && defined(__has_cpp_attribute)
25
+ #if __has_cpp_attribute(clang::fallthrough)
26
+ #define SKCMS_FALLTHROUGH [[clang::fallthrough]]
27
+ #endif
28
+
29
+ #ifndef SKCMS_HAS_MUSTTAIL
30
+ // [[clang::musttail]] is great for performance, but it's not well supported and we run into
31
+ // a variety of problems when we use it. Fortunately, it's an optional feature that doesn't
32
+ // affect correctness, and usually the compiler will generate a tail-call even for us
33
+ // whether or not we force it to do so.
34
+ //
35
+ // Known limitations:
36
+ // - Sanitizers do not work well with [[clang::musttail]], and corrupt src/dst pointers.
37
+ // (https://github.com/llvm/llvm-project/issues/70849)
38
+ // - Wasm tail-calls were only introduced in 2023 and aren't a mainstream feature yet.
39
+ // - Clang 18 runs into an ICE on armv7/androideabi with [[clang::musttail]].
40
+ // (http://crbug.com/1504548)
41
+ // - Android RISC-V also runs into an ICE (b/314692534)
42
+ // - Windows builds generate incorrect code with [[clang::musttail]] and crash mysteriously.
43
+ // (http://crbug.com/1505442)
44
+ #if __has_cpp_attribute(clang::musttail) && !__has_feature(memory_sanitizer) \
45
+ && !__has_feature(address_sanitizer) \
46
+ && !defined(__EMSCRIPTEN__) \
47
+ && !defined(__arm__) \
48
+ && !defined(__riscv) \
49
+ && !defined(_WIN32) && !defined(__SYMBIAN32__)
50
+ #define SKCMS_HAS_MUSTTAIL 1
51
+ #endif
52
+ #endif
53
+ #endif
54
+
55
+ #ifndef SKCMS_FALLTHROUGH
56
+ #define SKCMS_FALLTHROUGH
57
+ #endif
58
+ #ifndef SKCMS_HAS_MUSTTAIL
59
+ #define SKCMS_HAS_MUSTTAIL 0
60
+ #endif
61
+
62
+ #if defined(__clang__)
63
+ #define SKCMS_MAYBE_UNUSED __attribute__((unused))
64
+ #pragma clang diagnostic ignored "-Wused-but-marked-unused"
65
+ #elif defined(__GNUC__)
66
+ #define SKCMS_MAYBE_UNUSED __attribute__((unused))
67
+ #elif defined(_MSC_VER)
68
+ #define SKCMS_MAYBE_UNUSED __pragma(warning(suppress:4100))
69
+ #else
70
+ #define SKCMS_MAYBE_UNUSED
71
+ #endif
72
+
73
+ // sizeof(x) will return size_t, which is 32-bit on some machines and 64-bit on others.
74
+ // We have better testing on 64-bit machines, so force 32-bit machines to behave like 64-bit.
75
+ //
76
+ // Please do not use sizeof() directly, and size_t only when required.
77
+ // (We have no way of enforcing these requests...)
78
+ #define SAFE_SIZEOF(x) ((uint64_t)sizeof(x))
79
+
80
+ // Same sort of thing for _Layout structs with a variable sized array at the end (named "variable").
81
+ #define SAFE_FIXED_SIZE(type) ((uint64_t)offsetof(type, variable))
82
+
83
+ // If this isn't Clang, GCC, or Emscripten with SIMD support, we are in SKCMS_PORTABLE mode.
84
+ #if !defined(SKCMS_PORTABLE) && !(defined(__clang__) || \
85
+ defined(__GNUC__) || \
86
+ (defined(__EMSCRIPTEN__) && defined(__wasm_simd128__)))
87
+ #define SKCMS_PORTABLE 1
88
+ #endif
89
+
90
+ // If we are in SKCMS_PORTABLE mode or running on a non-x86-64 platform, we can't enable HSW or SKX.
91
+ // We also disable HSW/SKX on Android, even if it's Android on x64, since it's unlikely to benefit.
92
+ #if defined(SKCMS_PORTABLE) || !defined(__x86_64__) || defined(ANDROID) || defined(__ANDROID__)
93
+ #undef SKCMS_FORCE_HSW
94
+ #if !defined(SKCMS_DISABLE_HSW)
95
+ #define SKCMS_DISABLE_HSW 1
96
+ #endif
97
+
98
+ #undef SKCMS_FORCE_SKX
99
+ #if !defined(SKCMS_DISABLE_SKX)
100
+ #define SKCMS_DISABLE_SKX 1
101
+ #endif
102
+ #endif
103
+
104
+ // ~~~~ Shared ~~~~
105
+ typedef struct skcms_ICCTag {
106
+ uint32_t signature;
107
+ uint32_t type;
108
+ uint32_t size;
109
+ const uint8_t* buf;
110
+ } skcms_ICCTag;
111
+
112
+ typedef struct skcms_ICCProfile skcms_ICCProfile;
113
+ typedef struct skcms_TransferFunction skcms_TransferFunction;
114
+ typedef union skcms_Curve skcms_Curve;
115
+
116
+ void skcms_GetTagByIndex (const skcms_ICCProfile*, uint32_t idx, skcms_ICCTag*);
117
+ bool skcms_GetTagBySignature(const skcms_ICCProfile*, uint32_t sig, skcms_ICCTag*);
118
+
119
+ float skcms_MaxRoundtripError(const skcms_Curve* curve, const skcms_TransferFunction* inv_tf);
120
+
121
+ // 252 of a random shuffle of all possible bytes.
122
+ // 252 is evenly divisible by 3 and 4. Only 192, 10, 241, and 43 are missing.
123
+ // Used for ICC profile equivalence testing.
124
+ extern const uint8_t skcms_252_random_bytes[252];
125
+
126
+ // ~~~~ Portable Math ~~~~
127
+ static inline float floorf_(float x) {
128
+ float roundtrip = (float)((int)x);
129
+ return roundtrip > x ? roundtrip - 1 : roundtrip;
130
+ }
131
+ static inline float fabsf_(float x) { return x < 0 ? -x : x; }
132
+ float powf_(float, float);
133
+
134
+ #ifdef __cplusplus
135
+ }
136
+ #endif
@@ -0,0 +1,404 @@
1
+ /*
2
+ * Copyright 2018 Google Inc.
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ // skcms_public.h contains the entire public API for skcms.
11
+
12
+ #ifndef SKCMS_API
13
+ #define SKCMS_API
14
+ #endif
15
+
16
+ #include <stdbool.h>
17
+ #include <stddef.h>
18
+ #include <stdint.h>
19
+ #include <string.h>
20
+
21
+ #ifdef __cplusplus
22
+ extern "C" {
23
+ #endif
24
+
25
+ // A row-major 3x3 matrix (ie vals[row][col])
26
+ typedef struct skcms_Matrix3x3 {
27
+ float vals[3][3];
28
+ } skcms_Matrix3x3;
29
+
30
+ // It is _not_ safe to alias the pointers to invert in-place.
31
+ SKCMS_API bool skcms_Matrix3x3_invert(const skcms_Matrix3x3*, skcms_Matrix3x3*);
32
+ SKCMS_API skcms_Matrix3x3 skcms_Matrix3x3_concat(const skcms_Matrix3x3*, const skcms_Matrix3x3*);
33
+
34
+ // A row-major 3x4 matrix (ie vals[row][col])
35
+ typedef struct skcms_Matrix3x4 {
36
+ float vals[3][4];
37
+ } skcms_Matrix3x4;
38
+
39
+ // A transfer function mapping encoded values to linear values,
40
+ // represented by this 7-parameter piecewise function:
41
+ //
42
+ // linear = sign(encoded) * (c*|encoded| + f) , 0 <= |encoded| < d
43
+ // = sign(encoded) * ((a*|encoded| + b)^g + e), d <= |encoded|
44
+ //
45
+ // (A simple gamma transfer function sets g to gamma and a to 1.)
46
+ typedef struct skcms_TransferFunction {
47
+ float g, a,b,c,d,e,f;
48
+ } skcms_TransferFunction;
49
+
50
+ SKCMS_API float skcms_TransferFunction_eval (const skcms_TransferFunction*, float);
51
+ SKCMS_API bool skcms_TransferFunction_invert(const skcms_TransferFunction*,
52
+ skcms_TransferFunction*);
53
+
54
+ typedef enum skcms_TFType {
55
+ skcms_TFType_Invalid,
56
+ skcms_TFType_sRGBish,
57
+ skcms_TFType_PQish,
58
+ skcms_TFType_HLGish,
59
+ skcms_TFType_HLGinvish,
60
+ } skcms_TFType;
61
+
62
+ // Identify which kind of transfer function is encoded in an skcms_TransferFunction
63
+ SKCMS_API skcms_TFType skcms_TransferFunction_getType(const skcms_TransferFunction*);
64
+
65
+ // We can jam a couple alternate transfer function forms into skcms_TransferFunction,
66
+ // including those matching the general forms of the SMPTE ST 2084 PQ function or HLG.
67
+ //
68
+ // PQish:
69
+ // max(A + B|encoded|^C, 0)
70
+ // linear = sign(encoded) * (------------------------) ^ F
71
+ // D + E|encoded|^C
72
+ SKCMS_API bool skcms_TransferFunction_makePQish(skcms_TransferFunction*,
73
+ float A, float B, float C,
74
+ float D, float E, float F);
75
+ // HLGish:
76
+ // { K * sign(encoded) * ( (R|encoded|)^G ) when 0 <= |encoded| <= 1/R
77
+ // linear = { K * sign(encoded) * ( e^(a(|encoded|-c)) + b ) when 1/R < |encoded|
78
+ SKCMS_API bool skcms_TransferFunction_makeScaledHLGish(skcms_TransferFunction*,
79
+ float K, float R, float G,
80
+ float a, float b, float c);
81
+
82
+ // Compatibility shim with K=1 for old callers.
83
+ static inline bool skcms_TransferFunction_makeHLGish(skcms_TransferFunction* fn,
84
+ float R, float G,
85
+ float a, float b, float c) {
86
+ return skcms_TransferFunction_makeScaledHLGish(fn, 1.0f, R,G, a,b,c);
87
+ }
88
+
89
+ // PQ mapping encoded [0,1] to linear [0,1].
90
+ static inline bool skcms_TransferFunction_makePQ(skcms_TransferFunction* tf) {
91
+ return skcms_TransferFunction_makePQish(tf, -107/128.0f, 1.0f, 32/2523.0f
92
+ , 2413/128.0f, -2392/128.0f, 8192/1305.0f);
93
+ }
94
+ // HLG mapping encoded [0,1] to linear [0,12].
95
+ static inline bool skcms_TransferFunction_makeHLG(skcms_TransferFunction* tf) {
96
+ return skcms_TransferFunction_makeHLGish(tf, 2.0f, 2.0f
97
+ , 1/0.17883277f, 0.28466892f, 0.55991073f);
98
+ }
99
+
100
+ // Is this an ordinary sRGB-ish transfer function, or one of the HDR forms we support?
101
+ SKCMS_API bool skcms_TransferFunction_isSRGBish(const skcms_TransferFunction*);
102
+ SKCMS_API bool skcms_TransferFunction_isPQish (const skcms_TransferFunction*);
103
+ SKCMS_API bool skcms_TransferFunction_isHLGish (const skcms_TransferFunction*);
104
+
105
+ // Unified representation of 'curv' or 'para' tag data, or a 1D table from 'mft1' or 'mft2'
106
+ typedef union skcms_Curve {
107
+ struct {
108
+ uint32_t alias_of_table_entries;
109
+ skcms_TransferFunction parametric;
110
+ };
111
+ struct {
112
+ uint32_t table_entries;
113
+ const uint8_t* table_8;
114
+ const uint8_t* table_16;
115
+ };
116
+ } skcms_Curve;
117
+
118
+ // Complex transforms between device space (A) and profile connection space (B):
119
+ // A2B: device -> [ "A" curves -> CLUT ] -> [ "M" curves -> matrix ] -> "B" curves -> PCS
120
+ // B2A: device <- [ "A" curves <- CLUT ] <- [ "M" curves <- matrix ] <- "B" curves <- PCS
121
+
122
+ typedef struct skcms_A2B {
123
+ // Optional: N 1D "A" curves, followed by an N-dimensional CLUT.
124
+ // If input_channels == 0, these curves and CLUT are skipped,
125
+ // Otherwise, input_channels must be in [1, 4].
126
+ uint32_t input_channels;
127
+ skcms_Curve input_curves[4];
128
+ uint8_t grid_points[4];
129
+ const uint8_t* grid_8;
130
+ const uint8_t* grid_16;
131
+
132
+ // Optional: 3 1D "M" curves, followed by a color matrix.
133
+ // If matrix_channels == 0, these curves and matrix are skipped,
134
+ // Otherwise, matrix_channels must be 3.
135
+ uint32_t matrix_channels;
136
+ skcms_Curve matrix_curves[3];
137
+ skcms_Matrix3x4 matrix;
138
+
139
+ // Required: 3 1D "B" curves. Always present, and output_channels must be 3.
140
+ uint32_t output_channels;
141
+ skcms_Curve output_curves[3];
142
+ } skcms_A2B;
143
+
144
+ typedef struct skcms_B2A {
145
+ // Required: 3 1D "B" curves. Always present, and input_channels must be 3.
146
+ uint32_t input_channels;
147
+ skcms_Curve input_curves[3];
148
+
149
+ // Optional: a color matrix, followed by 3 1D "M" curves.
150
+ // If matrix_channels == 0, this matrix and these curves are skipped,
151
+ // Otherwise, matrix_channels must be 3.
152
+ uint32_t matrix_channels;
153
+ skcms_Matrix3x4 matrix;
154
+ skcms_Curve matrix_curves[3];
155
+
156
+ // Optional: an N-dimensional CLUT, followed by N 1D "A" curves.
157
+ // If output_channels == 0, this CLUT and these curves are skipped,
158
+ // Otherwise, output_channels must be in [1, 4].
159
+ uint32_t output_channels;
160
+ uint8_t grid_points[4];
161
+ const uint8_t* grid_8;
162
+ const uint8_t* grid_16;
163
+ skcms_Curve output_curves[4];
164
+ } skcms_B2A;
165
+
166
+ typedef struct skcms_CICP {
167
+ uint8_t color_primaries;
168
+ uint8_t transfer_characteristics;
169
+ uint8_t matrix_coefficients;
170
+ uint8_t video_full_range_flag;
171
+ } skcms_CICP;
172
+
173
+ typedef struct skcms_ICCProfile {
174
+ const uint8_t* buffer;
175
+
176
+ uint32_t size;
177
+ uint32_t data_color_space;
178
+ uint32_t pcs;
179
+ uint32_t tag_count;
180
+
181
+ // skcms_Parse() will set commonly-used fields for you when possible:
182
+
183
+ // If we can parse red, green and blue transfer curves from the profile,
184
+ // trc will be set to those three curves, and has_trc will be true.
185
+ bool has_trc;
186
+ skcms_Curve trc[3];
187
+
188
+ // If this profile's gamut can be represented by a 3x3 transform to XYZD50,
189
+ // skcms_Parse() sets toXYZD50 to that transform and has_toXYZD50 to true.
190
+ bool has_toXYZD50;
191
+ skcms_Matrix3x3 toXYZD50;
192
+
193
+ // If the profile has a valid A2B0 or A2B1 tag, skcms_Parse() sets A2B to
194
+ // that data, and has_A2B to true. skcms_ParseWithA2BPriority() does the
195
+ // same following any user-provided prioritization of A2B0, A2B1, or A2B2.
196
+ bool has_A2B;
197
+ skcms_A2B A2B;
198
+
199
+ // If the profile has a valid B2A0 or B2A1 tag, skcms_Parse() sets B2A to
200
+ // that data, and has_B2A to true. skcms_ParseWithA2BPriority() does the
201
+ // same following any user-provided prioritization of B2A0, B2A1, or B2A2.
202
+ bool has_B2A;
203
+ skcms_B2A B2A;
204
+
205
+ // If the profile has a valid CICP tag, skcms_Parse() sets CICP to that data,
206
+ // and has_CICP to true.
207
+ bool has_CICP;
208
+ skcms_CICP CICP;
209
+ } skcms_ICCProfile;
210
+
211
+ // The sRGB color profile is so commonly used that we offer a canonical skcms_ICCProfile for it.
212
+ SKCMS_API const skcms_ICCProfile* skcms_sRGB_profile(void);
213
+ // Ditto for XYZD50, the most common profile connection space.
214
+ SKCMS_API const skcms_ICCProfile* skcms_XYZD50_profile(void);
215
+
216
+ SKCMS_API const skcms_TransferFunction* skcms_sRGB_TransferFunction(void);
217
+ SKCMS_API const skcms_TransferFunction* skcms_sRGB_Inverse_TransferFunction(void);
218
+ SKCMS_API const skcms_TransferFunction* skcms_Identity_TransferFunction(void);
219
+
220
+ // Practical equality test for two skcms_ICCProfiles.
221
+ // The implementation is subject to change, but it will always try to answer
222
+ // "can I substitute A for B?" and "can I skip transforming from A to B?".
223
+ SKCMS_API bool skcms_ApproximatelyEqualProfiles(const skcms_ICCProfile* A,
224
+ const skcms_ICCProfile* B);
225
+
226
+ // Practical test that answers: Is curve roughly the inverse of inv_tf? Typically used by passing
227
+ // the inverse of a known parametric transfer function (like sRGB), to determine if a particular
228
+ // curve is very close to sRGB.
229
+ SKCMS_API bool skcms_AreApproximateInverses(const skcms_Curve* curve,
230
+ const skcms_TransferFunction* inv_tf);
231
+
232
+ // Similar to above, answering the question for all three TRC curves of the given profile. Again,
233
+ // passing skcms_sRGB_InverseTransferFunction as inv_tf will answer the question:
234
+ // "Does this profile have a transfer function that is very close to sRGB?"
235
+ SKCMS_API bool skcms_TRCs_AreApproximateInverse(const skcms_ICCProfile* profile,
236
+ const skcms_TransferFunction* inv_tf);
237
+
238
+ // Parse an ICC profile and return true if possible, otherwise return false.
239
+ // Selects an A2B profile (if present) according to priority list (each entry 0-2).
240
+ // The buffer is not copied; it must remain valid as long as the skcms_ICCProfile will be used.
241
+ SKCMS_API bool skcms_ParseWithA2BPriority(const void*, size_t,
242
+ const int priority[], int priorities,
243
+ skcms_ICCProfile*);
244
+
245
+ static inline bool skcms_Parse(const void* buf, size_t len, skcms_ICCProfile* profile) {
246
+ // For continuity of existing user expectations,
247
+ // prefer A2B0 (perceptual) over A2B1 (relative colormetric), and ignore A2B2 (saturation).
248
+ const int priority[] = {0,1};
249
+ return skcms_ParseWithA2BPriority(buf, len,
250
+ priority, sizeof(priority)/sizeof(*priority),
251
+ profile);
252
+ }
253
+
254
+ SKCMS_API bool skcms_ApproximateCurve(const skcms_Curve* curve,
255
+ skcms_TransferFunction* approx,
256
+ float* max_error);
257
+
258
+ SKCMS_API bool skcms_GetCHAD(const skcms_ICCProfile*, skcms_Matrix3x3*);
259
+ SKCMS_API bool skcms_GetWTPT(const skcms_ICCProfile*, float xyz[3]);
260
+
261
+ // These are common ICC signature values
262
+ enum {
263
+ // data_color_space
264
+ skcms_Signature_CMYK = 0x434D594B,
265
+ skcms_Signature_Gray = 0x47524159,
266
+ skcms_Signature_RGB = 0x52474220,
267
+
268
+ // pcs
269
+ skcms_Signature_Lab = 0x4C616220,
270
+ skcms_Signature_XYZ = 0x58595A20,
271
+ };
272
+
273
+ typedef enum skcms_PixelFormat {
274
+ skcms_PixelFormat_A_8,
275
+ skcms_PixelFormat_A_8_,
276
+ skcms_PixelFormat_G_8,
277
+ skcms_PixelFormat_G_8_,
278
+
279
+ skcms_PixelFormat_RGB_565,
280
+ skcms_PixelFormat_BGR_565,
281
+
282
+ skcms_PixelFormat_ABGR_4444,
283
+ skcms_PixelFormat_ARGB_4444,
284
+
285
+ skcms_PixelFormat_RGB_888,
286
+ skcms_PixelFormat_BGR_888,
287
+ skcms_PixelFormat_RGBA_8888,
288
+ skcms_PixelFormat_BGRA_8888,
289
+ skcms_PixelFormat_RGBA_8888_sRGB, // Automatic sRGB encoding / decoding.
290
+ skcms_PixelFormat_BGRA_8888_sRGB, // (Generally used with linear transfer functions.)
291
+
292
+ skcms_PixelFormat_RGBA_1010102,
293
+ skcms_PixelFormat_BGRA_1010102,
294
+
295
+ skcms_PixelFormat_RGB_161616LE, // Little-endian. Pointers must be 16-bit aligned.
296
+ skcms_PixelFormat_BGR_161616LE,
297
+ skcms_PixelFormat_RGBA_16161616LE,
298
+ skcms_PixelFormat_BGRA_16161616LE,
299
+
300
+ skcms_PixelFormat_RGB_161616BE, // Big-endian. Pointers must be 16-bit aligned.
301
+ skcms_PixelFormat_BGR_161616BE,
302
+ skcms_PixelFormat_RGBA_16161616BE,
303
+ skcms_PixelFormat_BGRA_16161616BE,
304
+
305
+ skcms_PixelFormat_RGB_hhh_Norm, // 1-5-10 half-precision float in [0,1]
306
+ skcms_PixelFormat_BGR_hhh_Norm, // Pointers must be 16-bit aligned.
307
+ skcms_PixelFormat_RGBA_hhhh_Norm,
308
+ skcms_PixelFormat_BGRA_hhhh_Norm,
309
+
310
+ skcms_PixelFormat_RGB_hhh, // 1-5-10 half-precision float.
311
+ skcms_PixelFormat_BGR_hhh, // Pointers must be 16-bit aligned.
312
+ skcms_PixelFormat_RGBA_hhhh,
313
+ skcms_PixelFormat_BGRA_hhhh,
314
+
315
+ skcms_PixelFormat_RGB_fff, // 1-8-23 single-precision float (the normal kind).
316
+ skcms_PixelFormat_BGR_fff, // Pointers must be 32-bit aligned.
317
+ skcms_PixelFormat_RGBA_ffff,
318
+ skcms_PixelFormat_BGRA_ffff,
319
+
320
+ skcms_PixelFormat_RGB_101010x_XR, // Note: This is located here to signal no clamping.
321
+ skcms_PixelFormat_BGR_101010x_XR, // Compatible with MTLPixelFormatBGR10_XR.
322
+ } skcms_PixelFormat;
323
+
324
+ // We always store any alpha channel linearly. In the chart below, tf-1() is the inverse
325
+ // transfer function for the given color profile (applying the transfer function linearizes).
326
+
327
+ // We treat opaque as a strong requirement, not just a performance hint: we will ignore
328
+ // any source alpha and treat it as 1.0, and will make sure that any destination alpha
329
+ // channel is filled with the equivalent of 1.0.
330
+
331
+ // We used to offer multiple types of premultiplication, but now just one, PremulAsEncoded.
332
+ // This is the premul you're probably used to working with.
333
+
334
+ typedef enum skcms_AlphaFormat {
335
+ skcms_AlphaFormat_Opaque, // alpha is always opaque
336
+ // tf-1(r), tf-1(g), tf-1(b), 1.0
337
+ skcms_AlphaFormat_Unpremul, // alpha and color are unassociated
338
+ // tf-1(r), tf-1(g), tf-1(b), a
339
+ skcms_AlphaFormat_PremulAsEncoded, // premultiplied while encoded
340
+ // tf-1(r)*a, tf-1(g)*a, tf-1(b)*a, a
341
+ } skcms_AlphaFormat;
342
+
343
+ // Convert npixels pixels from src format and color profile to dst format and color profile
344
+ // and return true, otherwise return false. It is safe to alias dst == src if dstFmt == srcFmt.
345
+ SKCMS_API bool skcms_Transform(const void* src,
346
+ skcms_PixelFormat srcFmt,
347
+ skcms_AlphaFormat srcAlpha,
348
+ const skcms_ICCProfile* srcProfile,
349
+ void* dst,
350
+ skcms_PixelFormat dstFmt,
351
+ skcms_AlphaFormat dstAlpha,
352
+ const skcms_ICCProfile* dstProfile,
353
+ size_t npixels);
354
+
355
+ // If profile can be used as a destination in skcms_Transform, return true. Otherwise, attempt to
356
+ // rewrite it with approximations where reasonable. If successful, return true. If no reasonable
357
+ // approximation exists, leave the profile unchanged and return false.
358
+ SKCMS_API bool skcms_MakeUsableAsDestination(skcms_ICCProfile* profile);
359
+
360
+ // If profile can be used as a destination with a single parametric transfer function (ie for
361
+ // rasterization), return true. Otherwise, attempt to rewrite it with approximations where
362
+ // reasonable. If successful, return true. If no reasonable approximation exists, leave the
363
+ // profile unchanged and return false.
364
+ SKCMS_API bool skcms_MakeUsableAsDestinationWithSingleCurve(skcms_ICCProfile* profile);
365
+
366
+ // Returns a matrix to adapt XYZ color from given the whitepoint to D50.
367
+ SKCMS_API bool skcms_AdaptToXYZD50(float wx, float wy,
368
+ skcms_Matrix3x3* toXYZD50);
369
+
370
+ // Returns a matrix to convert RGB color into XYZ adapted to D50, given the
371
+ // primaries and whitepoint of the RGB model.
372
+ SKCMS_API bool skcms_PrimariesToXYZD50(float rx, float ry,
373
+ float gx, float gy,
374
+ float bx, float by,
375
+ float wx, float wy,
376
+ skcms_Matrix3x3* toXYZD50);
377
+
378
+ // Call before your first call to skcms_Transform() to skip runtime CPU detection.
379
+ SKCMS_API void skcms_DisableRuntimeCPUDetection(void);
380
+
381
+ // Utilities for programmatically constructing profiles
382
+ static inline void skcms_Init(skcms_ICCProfile* p) {
383
+ memset(p, 0, sizeof(*p));
384
+ p->data_color_space = skcms_Signature_RGB;
385
+ p->pcs = skcms_Signature_XYZ;
386
+ }
387
+
388
+ static inline void skcms_SetTransferFunction(skcms_ICCProfile* p,
389
+ const skcms_TransferFunction* tf) {
390
+ p->has_trc = true;
391
+ for (int i = 0; i < 3; ++i) {
392
+ p->trc[i].table_entries = 0;
393
+ p->trc[i].parametric = *tf;
394
+ }
395
+ }
396
+
397
+ static inline void skcms_SetXYZD50(skcms_ICCProfile* p, const skcms_Matrix3x3* m) {
398
+ p->has_toXYZD50 = true;
399
+ p->toXYZD50 = *m;
400
+ }
401
+
402
+ #ifdef __cplusplus
403
+ }
404
+ #endif