Example #1
0
sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& toXYZD50) {
    sk_sp<SkGammas> gammas = nullptr;

    // Check if we really have sRGB or Adobe RGB
    if (color_space_almost_equal(2.2f, gammaVals[0]) &&
        color_space_almost_equal(2.2f, gammaVals[1]) &&
        color_space_almost_equal(2.2f, gammaVals[2]))
    {
        gStandardGammasOnce([] {
            gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f);
        });
        gammas = sk_ref_sp(gStandardGammas);

        if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) {
            return SkColorSpace::NewNamed(kSRGB_Named);
        } else if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) {
            return SkColorSpace::NewNamed(kAdobeRGB_Named);
        }
    }

    if (!gammas) {
        gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaVals[2]));
    }
    return sk_sp<SkColorSpace>(new SkColorSpace(gammas, toXYZD50, kUnknown_Named));
}
Example #2
0
sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(GammaNamed gammaNamed, const SkMatrix44& toXYZD50) {
    switch (gammaNamed) {
        case kSRGB_GammaNamed:
            if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) {
                return SkColorSpace::NewNamed(kSRGB_Named);
            }
            break;
        case k2Dot2Curve_GammaNamed:
            if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) {
                return SkColorSpace::NewNamed(kAdobeRGB_Named);
            }
            break;
        case kNonStandard_GammaNamed:
            // This is not allowed.
            return nullptr;
        default:
            break;
    }

    return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50, kUnknown_Named));
}
Example #3
0
sk_sp<SkColorSpace> SkColorSpace::MakeRGB(const skcms_TransferFunction& transferFn,
                                          const skcms_Matrix3x3& toXYZ) {
    if (!is_valid_transfer_fn(transferFn)) {
        return nullptr;
    }

    const float* tf = &transferFn.g;

    if (is_almost_srgb(transferFn)) {
        if (xyz_almost_equal(toXYZ, SkNamedGamut::kSRGB)) {
            return SkColorSpace::MakeSRGB();
        }
        tf = &SkNamedTransferFn::kSRGB.g;
    } else if (is_almost_2dot2(transferFn)) {
        tf = &SkNamedTransferFn::k2Dot2.g;
    } else if (is_almost_linear(transferFn)) {
        if (xyz_almost_equal(toXYZ, SkNamedGamut::kSRGB)) {
            return SkColorSpace::MakeSRGBLinear();
        }
        tf = &SkNamedTransferFn::kLinear.g;
    }

    return sk_sp<SkColorSpace>(new SkColorSpace(tf, toXYZ));
}