shared/java/ColorSpace.java (81 lines of code) (raw):

package org.jetbrains.skija; import java.lang.ref.*; import org.jetbrains.annotations.*; import org.jetbrains.skija.impl.*; public class ColorSpace extends Managed { static { Library.staticLoad(); } public static class _SRGBHolder { static { Stats.onNativeCall(); } public static final ColorSpace INSTANCE = new ColorSpace(_nMakeSRGB(), false); } public static ColorSpace getSRGB() { return _SRGBHolder.INSTANCE; } public static class _SRGBLinearHolder { static { Stats.onNativeCall(); } public static final ColorSpace INSTANCE = new ColorSpace(_nMakeSRGBLinear(), false); } public static ColorSpace getSRGBLinear() { return _SRGBLinearHolder.INSTANCE; } public static class _DisplayP3Holder { static { Stats.onNativeCall(); } public static final ColorSpace INSTANCE = new ColorSpace(_nMakeDisplayP3(), false); } public static ColorSpace getDisplayP3() { return _DisplayP3Holder.INSTANCE; } public Color4f convert(ColorSpace to, Color4f color) { to = to == null ? getSRGB() : to; try { return new Color4f(_nConvert(_ptr, Native.getPtr(to), color.getR(), color.getG(), color.getB(), color.getA())); } finally { Reference.reachabilityFence(this); Reference.reachabilityFence(to); } } @ApiStatus.Internal public ColorSpace(long ptr) { super(ptr, _FinalizerHolder.PTR, true); } @ApiStatus.Internal public ColorSpace(long ptr, boolean managed) { super(ptr, _FinalizerHolder.PTR, managed); } /** * @return true if the color space gamma is near enough to be approximated as sRGB */ public boolean isGammaCloseToSRGB() { try { Stats.onNativeCall(); return _nIsGammaCloseToSRGB(_ptr); } finally { Reference.reachabilityFence(this); } } /** * @return true if the color space gamma is linear */ public boolean isGammaLinear() { try { Stats.onNativeCall(); return _nIsGammaLinear(_ptr); } finally { Reference.reachabilityFence(this); } } /** * <p>Returns true if the color space is sRGB. Returns false otherwise.</p> * * <p>This allows a little bit of tolerance, given that we might see small numerical error * in some cases: converting ICC fixed point to float, converting white point to D50, * rounding decisions on transfer function and matrix.</p> * * <p>This does not consider a 2.2f exponential transfer function to be sRGB. While these * functions are similar (and it is sometimes useful to consider them together), this * function checks for logical equality.</p> */ public boolean isSRGB() { try { Stats.onNativeCall(); return _nIsSRGB(_ptr); } finally { Reference.reachabilityFence(this); } } @ApiStatus.Internal public static class _FinalizerHolder { public static final long PTR = _nGetFinalizer(); } public static native long _nGetFinalizer(); public static native long _nMakeSRGB(); public static native long _nMakeDisplayP3(); public static native long _nMakeSRGBLinear(); public static native float[] _nConvert(long fromPtr, long toPtr, float r, float g, float b, float a); public static native boolean _nIsGammaCloseToSRGB(long ptr); public static native boolean _nIsGammaLinear(long ptr); public static native boolean _nIsSRGB(long ptr); }