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

Commit a546631b authored by Tyler Freeman's avatar Tyler Freeman
Browse files

feat(force invert): also count areas of draw calls with Bitmap palettes

Bug: 372558459
Flag: android.view.accessibility.force_invert_color
Test: atest hwui_unit_tests

Change-Id: I83ffc61af1a2986d99a9e860fe35c0f4a3f1227d
parent fe97af4f
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -143,7 +143,7 @@ static BitmapPalette paletteForColorHSV(SkColor color) {
    return hsv[2] >= .5f ? BitmapPalette::Light : BitmapPalette::Dark;
    return hsv[2] >= .5f ? BitmapPalette::Light : BitmapPalette::Dark;
}
}


static BitmapPalette filterPalette(const SkPaint* paint, BitmapPalette palette) {
BitmapPalette filterPalette(const SkPaint* paint, BitmapPalette palette) {
    if (palette == BitmapPalette::Unknown || !paint || !paint->getColorFilter()) {
    if (palette == BitmapPalette::Unknown || !paint || !paint->getColorFilter()) {
        return palette;
        return palette;
    }
    }
+3 −0
Original line number Original line Diff line number Diff line
@@ -48,4 +48,7 @@ bool transformPaint(ColorTransform transform, SkPaint* paint, BitmapPalette pale
SkColor transformColor(ColorTransform transform, SkColor color);
SkColor transformColor(ColorTransform transform, SkColor color);
SkColor transformColorInverse(ColorTransform transform, SkColor color);
SkColor transformColorInverse(ColorTransform transform, SkColor color);


/** Returns a palette corrected in case it is tinted by the given paint's filter */
BitmapPalette filterPalette(const SkPaint* paint, BitmapPalette palette);

}  // namespace android::uirenderer
}  // namespace android::uirenderer
+27 −5
Original line number Original line Diff line number Diff line
@@ -16,23 +16,27 @@


#include "ColorArea.h"
#include "ColorArea.h"


#include "CanvasTransform.h"
#include "utils/MathUtils.h"
#include "utils/MathUtils.h"


namespace android::uirenderer {
namespace android::uirenderer {


constexpr static int kMinimumAlphaToConsiderArea = 200;
constexpr static int kMinimumAlphaToConsiderArea = 200;


inline uint64_t calculateArea(int32_t width, int32_t height) {
    // HWUI doesn't draw anything with negative width or height
    if (width <= 0 || height <= 0) return 0;

    return width * height;
}

void ColorArea::addArea(const SkRect& rect, const SkPaint* paint) {
void ColorArea::addArea(const SkRect& rect, const SkPaint* paint) {
    addArea(rect.width(), rect.height(), paint);
    addArea(rect.width(), rect.height(), paint);
}
}


void ColorArea::addArea(int32_t width, int32_t height, const SkPaint* paint) {
void ColorArea::addArea(int32_t width, int32_t height, const SkPaint* paint) {
    if (!paint) return;
    if (!paint) return;
    // HWUI doesn't draw anything with negative width or height
    addArea(calculateArea(width, height), *paint);
    if (width <= 0 || height <= 0) return;

    uint64_t area = width * height;
    addArea(area, *paint);
}
}


void ColorArea::addArea(uint64_t area, const SkPaint& paint) {
void ColorArea::addArea(uint64_t area, const SkPaint& paint) {
@@ -48,6 +52,24 @@ void ColorArea::addArea(uint64_t area, const SkPaint& paint) {
    addArea(area, paint.getColor());
    addArea(area, paint.getColor());
}
}


void ColorArea::addArea(const SkRect& bounds, const SkPaint& paint,
                        android::BitmapPalette palette) {
    palette = filterPalette(&paint, palette);
    auto area = calculateArea(bounds.width(), bounds.height());
    switch (palette) {
        case android::BitmapPalette::Light:
            addArea(area, Light);
            break;
        case android::BitmapPalette::Dark:
            addArea(area, Dark);
            break;
        case android::BitmapPalette::Colorful:
        case android::BitmapPalette::Unknown:
            addArea(area, Unknown);
            break;
    }
}

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


+6 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@
#include <SkCanvas.h>
#include <SkCanvas.h>
#include <SkPaintFilterCanvas.h>
#include <SkPaintFilterCanvas.h>


#include "hwui/Bitmap.h"
#include "utils/Color.h"
#include "utils/Color.h"
#include "utils/Macros.h"
#include "utils/Macros.h"


@@ -68,6 +69,11 @@ public:
    /**
    /**
     * See [addArea(uint64_t, SkPaint&)]
     * See [addArea(uint64_t, SkPaint&)]
     */
     */
    void addArea(const SkRect& rect, const SkPaint& paint, android::BitmapPalette palette);

    /**
     * See [addArea(long, SkPaint&)]
     */
    void addArea(int32_t width, int32_t height, const SkPaint* paint);
    void addArea(int32_t width, int32_t height, const SkPaint* paint);


    /**
    /**
+12 −1
Original line number Original line Diff line number Diff line
@@ -828,7 +828,18 @@ constexpr bool has_bounds = std::experimental::is_detected_v<has_bounds_helper,


template <class T>
template <class T>
constexpr color_area_fn colorAreaForOp() {
constexpr color_area_fn colorAreaForOp() {
    if constexpr (has_paint<T> && has_bounds<T>) {
    if constexpr (has_palette<T> && has_bounds<T>) {
        return [](const void* opRaw, ColorArea* accumulator) {
            const T* op = reinterpret_cast<const T*>(opRaw);
            const SkPaint* paint = &op->paint;
            if (!paint) return;

            auto rect = op->getConservativeBounds();
            if (!rect.has_value()) return;

            accumulator->addArea(*rect, *paint, op->palette);
        };
    } else if constexpr (has_paint<T> && has_bounds<T>) {
        return [](const void* opRaw, ColorArea* accumulator) {
        return [](const void* opRaw, ColorArea* accumulator) {
            const T* op = reinterpret_cast<const T*>(opRaw);
            const T* op = reinterpret_cast<const T*>(opRaw);
            const SkPaint* paint = &op->paint;
            const SkPaint* paint = &op->paint;