Skip to content

Commit

Permalink
Implement invertColors
Browse files Browse the repository at this point in the history
  • Loading branch information
eyebrowsoffire committed May 17, 2023
1 parent 163ce3b commit 0553179
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 8 deletions.
5 changes: 5 additions & 0 deletions lib/web_ui/lib/src/engine/skwasm/skwasm_impl/filters.dart
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ class SkwasmColorFilter {
}),
};

factory SkwasmColorFilter.composed(
SkwasmColorFilter outer,
SkwasmColorFilter inner,
) => SkwasmColorFilter._(colorFilterCompose(outer.handle, inner.handle));

void dispose() {
if (!_isDisposed) {
colorFilterDispose(handle);
Expand Down
50 changes: 42 additions & 8 deletions lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ class SkwasmPaint implements ui.Paint {

ui.MaskFilter? _maskFilter;

bool _invertColors = false;

static final SkwasmColorFilter _invertColorFilter = SkwasmColorFilter.fromEngineColorFilter(
const EngineColorFilter.matrix(<double>[
-1.0, 0, 0, 1.0, 0, // row
0, -1.0, 0, 1.0, 0, // row
0, 0, -1.0, 1.0, 0, // row
1.0, 1.0, 1.0, 1.0, 0
])
);

@override
ui.BlendMode get blendMode {
return _cachedBlendMode;
Expand Down Expand Up @@ -113,18 +124,32 @@ class SkwasmPaint implements ui.Paint {
@override
ui.ColorFilter? get colorFilter => _colorFilter;

@override
set colorFilter(ui.ColorFilter? filter) {
_colorFilter = filter as EngineColorFilter?;
if (filter == null) {
paintSetColorFilter(handle, nullptr);
} else {
final SkwasmColorFilter nativeFilter = SkwasmColorFilter.fromEngineColorFilter(filter);
void _setEffectiveColorFilter() {
final SkwasmColorFilter? nativeFilter = _colorFilter != null
? SkwasmColorFilter.fromEngineColorFilter(_colorFilter!) : null;
if (_invertColors) {
if (nativeFilter != null) {
final SkwasmColorFilter composedFilter = SkwasmColorFilter.composed(_invertColorFilter, nativeFilter);
nativeFilter.dispose();
paintSetColorFilter(handle, composedFilter.handle);
composedFilter.dispose();
} else {
paintSetColorFilter(handle, _invertColorFilter.handle);
}
} else if (nativeFilter != null) {
paintSetColorFilter(handle, nativeFilter.handle);
nativeFilter.dispose();
} else {
paintSetColorFilter(handle, nullptr);
}
}

@override
set colorFilter(ui.ColorFilter? filter) {
_colorFilter = filter as EngineColorFilter?;
_setEffectiveColorFilter();
}

@override
ui.MaskFilter? get maskFilter => _maskFilter;

Expand All @@ -141,5 +166,14 @@ class SkwasmPaint implements ui.Paint {
}

@override
bool invertColors = false;
bool get invertColors => _invertColors;

@override
set invertColors(bool invertColors) {
if (_invertColors == invertColors) {
return;
}
_invertColors = invertColors;
_setEffectiveColorFilter();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,15 @@ external ColorFilterHandle colorFilterCreateSRGBToLinearGamma();
@Native<ColorFilterHandle Function()>(symbol: 'colorFilter_createLinearToSRGBGamma', isLeaf: true)
external ColorFilterHandle colorFilterCreateLinearToSRGBGamma();

@Native<ColorFilterHandle Function(
ColorFilterHandle,
ColorFilterHandle
)>(symbol: 'colorFilter_compose', isLeaf: true)
external ColorFilterHandle colorFilterCompose(
ColorFilterHandle outer,
ColorFilterHandle inner,
);

@Native<Void Function(ColorFilterHandle)>(symbol: 'colorFilter_dispose', isLeaf: true)
external void colorFilterDispose(ColorFilterHandle handle);

Expand Down
9 changes: 9 additions & 0 deletions lib/web_ui/skwasm/filters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,15 @@ SKWASM_EXPORT SkColorFilter* colorFilter_createLinearToSRGBGamma() {
return SkColorFilters::LinearToSRGBGamma().release();
}

SKWASM_EXPORT SkColorFilter* colorFilter_compose(SkColorFilter* outer,
SkColorFilter* inner) {
outer->ref();
inner->ref();
return SkColorFilters::Compose(sk_sp<SkColorFilter>(outer),
sk_sp<SkColorFilter>(inner))
.release();
}

SKWASM_EXPORT void colorFilter_dispose(SkColorFilter* filter) {
filter->unref();
}
Expand Down
19 changes: 19 additions & 0 deletions lib/web_ui/test/ui/filters_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,25 @@ Future<void> testMain() async {
await matchGoldenFile('ui_filter_matrix_colorfilter.png', region: region);
});

test('invert colors', () async {
await drawTestImageWithPaint(ui.Paint()..invertColors = true);
await matchGoldenFile('ui_filter_invert_colors.png', region: region);
});

test('invert colors with color filter', () async {
const ui.ColorFilter sepia = ui.ColorFilter.matrix(<double>[
0.393, 0.769, 0.189, 0, 0,
0.349, 0.686, 0.168, 0, 0,
0.272, 0.534, 0.131, 0, 0,
0, 0, 0, 1, 0,
]);

await drawTestImageWithPaint(ui.Paint()
..invertColors = true
..colorFilter = sepia);
await matchGoldenFile('ui_filter_invert_colors_with_colorfilter.png', region: region);
});

test('mask filter', () async {
const ui.MaskFilter maskFilter = ui.MaskFilter.blur(ui.BlurStyle.normal, 25.0);
await drawTestImageWithPaint(ui.Paint()..maskFilter = maskFilter);
Expand Down

0 comments on commit 0553179

Please sign in to comment.