From e5842180efe1cb4fa6075748c1cc6c895e8c3eae Mon Sep 17 00:00:00 2001 From: anoshenko Date: Mon, 19 Dec 2022 18:31:35 +0300 Subject: [PATCH] Added mix-blend-mode and background-blend-mode --- CHANGELOG.md | 7 ++++ propertyNames.go | 16 ++++++++++ propertySet.go | 10 ++++++ propertyValues.go | 81 +++++++++++++++++++++++++++++++++++++++++++++++ viewStyle.go | 2 +- viewUtils.go | 24 ++++++++++++++ 6 files changed, 139 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad372a..c55347e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# v.11.0 + +* Added "order", "background-blend-mode", and "mix-blend-mode" properties +* Added GetOrder, GetBackgroundBlendMode, and GetMixBlendMode functions +* ClientItem, SetClientItem, and RemoveAllClientItems method added to Session interface +* PropertyWithTag method of DataObject interface renamed to PropertyByTag + # v.10.0 * The Canvas.TextWidth method replaced by Canvas.TextMetrics diff --git a/propertyNames.go b/propertyNames.go index df26607..318eeaf 100644 --- a/propertyNames.go +++ b/propertyNames.go @@ -674,4 +674,20 @@ const ( // The "Order" int property sets the order to layout an item in a ListLayout or GridLayout container. // Items in a container are sorted by ascending order value and then by their source code order. Order = "Order" + + // BackgroundBlendMode is the constant for the "background-blend-mode" property tag. + // The "background-blend-mode" int property sets how an element's background images should blend + // with each other and with the element's background color. + // Valid values are "normal" (0), "multiply" (1), "screen" (2), "overlay" (3), "darken" (4), "lighten" (5), + // "color-dodge" (6), "color-burn" (7), "hard-light" (8), "soft-light" (9), "difference" (10), + // "exclusion" (11), "hue" (12), "saturation" (13), "color" (14), "luminosity" (15). + BackgroundBlendMode = "background-blend-mode" + + // MixBlendMode is the constant for the "mix-blend-mode" property tag. + // The "mix-blend-mode" int property sets how a view's content should blend + // with the content of the view's parent and the view's background. + // Valid values are "normal" (0), "multiply" (1), "screen" (2), "overlay" (3), "darken" (4), "lighten" (5), + // "color-dodge" (6), "color-burn" (7), "hard-light" (8), "soft-light" (9), "difference" (10), + // "exclusion" (11), "hue" (12), "saturation" (13), "color" (14), "luminosity" (15). + MixBlendMode = "mix-blend-mode" ) diff --git a/propertySet.go b/propertySet.go index ab62187..8d8a775 100644 --- a/propertySet.go +++ b/propertySet.go @@ -448,6 +448,16 @@ var enumProperties = map[string]struct { "", []string{"none", "top", "right", "bottom", "left"}, }, + MixBlendMode: { + []string{"normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"}, + MixBlendMode, + []string{"normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"}, + }, + BackgroundBlendMode: { + []string{"normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"}, + BackgroundBlendMode, + []string{"normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"}, + }, } func notCompatibleType(tag string, value any) { diff --git a/propertyValues.go b/propertyValues.go index 27e630b..d262463 100644 --- a/propertyValues.go +++ b/propertyValues.go @@ -307,4 +307,85 @@ const ( // "dense" packing algorithm attempts to fill in holes earlier in the grid, if smaller items come up later. // This may cause views to appear out-of-order, when doing so would fill in holes left by larger views. ColumnDenseAutoFlow = 3 + + // BlendNormal - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the top color, regardless of what the bottom color is. + // The effect is like two opaque pieces of paper overlapping. + BlendNormal = 0 + + // BlendMultiply - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the result of multiplying the top and bottom colors. + // A black layer leads to a black final layer, and a white layer leads to no change. + // The effect is like two images printed on transparent film overlapping. + BlendMultiply = 1 + + // BlendScreen - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the result of inverting the colors, multiplying them, and inverting that value. + // A black layer leads to no change, and a white layer leads to a white final layer. + // The effect is like two images shone onto a projection screen. + BlendScreen = 2 + + // BlendOverlay - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the result of multiply if the bottom color is darker, or screen if the bottom color is lighter. + // This blend mode is equivalent to hard-light but with the layers swapped. + BlendOverlay = 3 + + // BlendDarken - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is composed of the darkest values of each color channel. + BlendDarken = 4 + + // BlendLighten - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is composed of the lightest values of each color channel. + BlendLighten = 5 + + // BlendColorDodge - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the result of dividing the bottom color by the inverse of the top color. + // A black foreground leads to no change. A foreground with the inverse color of the backdrop leads to a fully lit color. + // This blend mode is similar to screen, but the foreground need only be as light as the inverse of the backdrop to create a fully lit color. + BlendColorDodge = 6 + + // BlendColorBurn - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the result of inverting the bottom color, dividing the value by the top color, and inverting that value. + // A white foreground leads to no change. A foreground with the inverse color of the backdrop leads to a black final image. + // This blend mode is similar to multiply, but the foreground need only be as dark as the inverse of the backdrop to make the final image black. + BlendColorBurn = 7 + + // BlendHardLight - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the result of multiply if the top color is darker, or screen if the top color is lighter. + // This blend mode is equivalent to overlay but with the layers swapped. The effect is similar to shining a harsh spotlight on the backdrop. + BlendHardLight = 8 + + // BlendSoftLight - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is similar to hard-light, but softer. This blend mode behaves similar to hard-light. + // The effect is similar to shining a diffused spotlight on the backdrop*.* + BlendSoftLight = 9 + + // BlendDifference - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is the result of subtracting the darker of the two colors from the lighter one. + // A black layer has no effect, while a white layer inverts the other layer's color. + BlendDifference = 10 + + // BlendExclusion - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color is similar to difference, but with less contrast. + // As with difference, a black layer has no effect, while a white layer inverts the other layer's color. + BlendExclusion = 11 + + // BlendHue - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color has the hue of the top color, while using the saturation and luminosity of the bottom color. + BlendHue = 12 + + // BlendSaturation - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color has the saturation of the top color, while using the hue and luminosity of the bottom color. + // A pure gray backdrop, having no saturation, will have no effect. + BlendSaturation = 13 + + // BlendColor - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color has the hue and saturation of the top color, while using the luminosity of the bottom color. + // The effect preserves gray levels and can be used to colorize the foreground. + BlendColor = 14 + + // BlendLuminosity - value of the "mix-blend-mode" and "background-blend-mode" property: + // The final color has the luminosity of the top color, while using the hue and saturation of the bottom color. + // This blend mode is equivalent to BlendColor, but with the layers swapped. + BlendLuminosity = 15 ) diff --git a/viewStyle.go b/viewStyle.go index 1c505b6..789537b 100644 --- a/viewStyle.go +++ b/viewStyle.go @@ -252,7 +252,7 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) { for _, tag := range []string{ Overflow, TextAlign, TextTransform, TextWeight, TextLineStyle, WritingMode, TextDirection, VerticalTextOrientation, CellVerticalAlign, CellHorizontalAlign, GridAutoFlow, Cursor, - WhiteSpace, WordBreak, TextOverflow, Float, TableVerticalAlign, Resize} { + WhiteSpace, WordBreak, TextOverflow, Float, TableVerticalAlign, Resize, MixBlendMode, BackgroundBlendMode} { if data, ok := enumProperties[tag]; ok { if tag != VerticalTextOrientation || (writingMode != VerticalLeftToRight && writingMode != VerticalRightToLeft) { diff --git a/viewUtils.go b/viewUtils.go index 5e89dbe..335274e 100644 --- a/viewUtils.go +++ b/viewUtils.go @@ -896,3 +896,27 @@ func isUserSelect(view View) (bool, bool) { return false, false } + +// GetMixBlendMode returns a "mix-blend-mode" of the subview. Returns one of next values: +// +// BlendNormal (0), BlendMultiply (1), BlendScreen (2), BlendOverlay (3), BlendDarken (4), +// BlendLighten (5), BlendColorDodge (6), BlendColorBurn (7), BlendHardLight (8), +// BlendSoftLight (9), BlendDifference (10), BlendExclusion (11), BlendHue (12), +// BlendSaturation (13), BlendColor (14), BlendLuminosity (15) +// +// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned. +func GetMixBlendMode(view View, subviewID ...string) int { + return enumStyledProperty(view, subviewID, MixBlendMode, BlendNormal, true) +} + +// GetBackgroundBlendMode returns a "background-blend-mode" of the subview. Returns one of next values: +// +// BlendNormal (0), BlendMultiply (1), BlendScreen (2), BlendOverlay (3), BlendDarken (4), +// BlendLighten (5), BlendColorDodge (6), BlendColorBurn (7), BlendHardLight (8), +// BlendSoftLight (9), BlendDifference (10), BlendExclusion (11), BlendHue (12), +// BlendSaturation (13), BlendColor (14), BlendLuminosity (15) +// +// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned. +func GetBackgroundBlendMode(view View, subviewID ...string) int { + return enumStyledProperty(view, subviewID, BackgroundBlendMode, BlendNormal, true) +}