Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae3331c3 authored by Ben Wagner's avatar Ben Wagner
Browse files

Migrate from SkColor to SkColor4f

Migrate from SkColor to SkColor4f when doing color transforms.

Flag: EXEMPT refactor
Change-Id: Ic5084e10c6de308c4d6a05d61224bf26bd768644
parent 4f946451
Loading
Loading
Loading
Loading
+12 −13
Original line number Diff line number Diff line
@@ -33,35 +33,35 @@

namespace android::uirenderer {

SkColor makeLight(SkColor color) {
SkColor4f makeLight(SkColor4f color) {
    Lab lab = sRGBToLab(color);
    float invertedL = std::min(110 - lab.L, 100.0f);
    if (invertedL > lab.L) {
        lab.L = invertedL;
        return LabToSRGB(lab, SkColorGetA(color));
        return LabToSRGB(lab, color.fA);
    } else {
        return color;
    }
}

SkColor makeDark(SkColor color) {
SkColor4f makeDark(SkColor4f color) {
    Lab lab = sRGBToLab(color);
    float invertedL = std::min(110 - lab.L, 100.0f);
    if (invertedL < lab.L) {
        lab.L = invertedL;
        return LabToSRGB(lab, SkColorGetA(color));
        return LabToSRGB(lab, color.fA);
    } else {
        return color;
    }
}

SkColor invert(SkColor color) {
SkColor4f invert(SkColor4f color) {
    Lab lab = sRGBToLab(color);
    lab.L = 100 - lab.L;
    return LabToSRGB(lab, SkColorGetA(color));
    return LabToSRGB(lab, color.fA);
}

SkColor transformColor(ColorTransform transform, SkColor color) {
SkColor4f transformColor(ColorTransform transform, SkColor4f color) {
    switch (transform) {
        case ColorTransform::Light:
            return makeLight(color);
@@ -74,7 +74,7 @@ SkColor transformColor(ColorTransform transform, SkColor color) {
    }
}

SkColor transformColorInverse(ColorTransform transform, SkColor color) {
SkColor4f transformColorInverse(ColorTransform transform, SkColor4f color) {
    switch (transform) {
        case ColorTransform::Dark:
            return makeLight(color);
@@ -88,7 +88,7 @@ SkColor transformColorInverse(ColorTransform transform, SkColor color) {
static void applyColorTransform(ColorTransform transform, SkPaint& paint) {
    if (transform == ColorTransform::None) return;

    SkColor newColor = transformColor(transform, paint.getColor());
    SkColor4f newColor = transformColor(transform, paint.getColor4f());
    paint.setColor(newColor);

    if (paint.getShader()) {
@@ -102,8 +102,7 @@ static void applyColorTransform(ColorTransform transform, SkPaint& paint) {
        if (SkAndroidFrameworkUtils::ShaderAsALinearGradient(paint.getShader(), &info) &&
            info.fColorCount <= _colorStorage.size()) {
            for (int i = 0; i < info.fColorCount; i++) {
                SkColor transformedColor = transformColor(transform, info.fColors[i].toSkColor());
                info.fColors[i] = SkColor4f::FromColor(transformedColor);
                info.fColors[i] = transformColor(transform, info.fColors[i]);
            }
            paint.setShader(SkGradientShader::MakeLinear(
                    info.fPoints, info.fColors, nullptr, info.fColorOffsets, info.fColorCount,
@@ -116,8 +115,8 @@ static void applyColorTransform(ColorTransform transform, SkPaint& paint) {
        SkColor color;
        // TODO: LRU this or something to avoid spamming new color mode filters
        if (paint.getColorFilter()->asAColorMode(&color, &mode)) {
            color = transformColor(transform, color);
            paint.setColorFilter(SkColorFilters::Blend(color, mode));
            SkColor4f transformedColor = transformColor(transform, SkColor4f::FromColor(color));
            paint.setColorFilter(SkColorFilters::Blend(transformedColor, nullptr, mode));
        }
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@ bool transformPaint(ColorTransform transform, SkPaint* paint);

bool transformPaint(ColorTransform transform, SkPaint* paint, BitmapPalette palette);

SkColor transformColor(ColorTransform transform, SkColor color);
SkColor transformColorInverse(ColorTransform transform, SkColor color);
SkColor4f transformColor(ColorTransform transform, SkColor4f color);
SkColor4f transformColorInverse(ColorTransform transform, SkColor4f color);

/** Returns a palette corrected in case it is tinted by the given paint's filter */
BitmapPalette filterPalette(const SkPaint* paint, BitmapPalette palette);
+4 −4
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@

namespace android::uirenderer {

constexpr static int kMinimumAlphaToConsiderArea = 200;
constexpr static float kMinimumAlphaToConsiderArea = 200.0f / 255.0f;

inline uint64_t calculateArea(int32_t width, int32_t height) {
    // HWUI doesn't draw anything with negative width or height
@@ -49,7 +49,7 @@ void ColorArea::addArea(uint64_t area, const SkPaint& paint) {
        return;
    }

    addArea(area, paint.getColor());
    addArea(area, paint.getColor4f());
}

void ColorArea::addArea(const SkRect& bounds, const SkPaint& paint,
@@ -70,8 +70,8 @@ void ColorArea::addArea(const SkRect& bounds, const SkPaint& paint,
    }
}

void ColorArea::addArea(uint64_t area, SkColor color) {
    if (CC_UNLIKELY(SkColorGetA(color) < kMinimumAlphaToConsiderArea)) return;
void ColorArea::addArea(uint64_t area, SkColor4f color) {
    if (CC_UNLIKELY(color.fA < kMinimumAlphaToConsiderArea)) return;

    // TODO(b/381930266): optimize by detecting common black/white/grey colors and avoid converting
    //  also maybe cache colors or something?
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ public:
    /**
     * See [addArea(uint64_t, SkPaint&)]
     */
    void addArea(uint64_t area, SkColor color);
    void addArea(uint64_t area, SkColor4f color);

    /**
     * Prefer [addArea(uint64_t, SkPaint&)], unless the area you're measuring doesn't have a paint
+1 −1
Original line number Diff line number Diff line
@@ -1253,7 +1253,7 @@ constexpr color_transform_fn colorTransformForOp<DrawRippleDrawable>() {
    return [](const void* opRaw, ColorTransform transform) {
        const DrawRippleDrawable* op = reinterpret_cast<const DrawRippleDrawable*>(opRaw);
        // Ripple drawable needs to contrast against the background, so we need the inverse color.
        SkColor color = transformColorInverse(transform, op->mParams.color);
        SkColor4f color = transformColorInverse(transform, op->mParams.color);
        const_cast<DrawRippleDrawable*>(op)->mParams.color = color;
    };
}
Loading