Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NUI] Support ImageView and ImageVisual the SamplingMode #6345

Merged
merged 1 commit into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions src/Tizen.NUI/src/public/BaseComponents/ImageView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ private static string ConvertResourceUrl(ref string value)
ImageVisualProperty.AlphaMaskURL,
ImageVisualProperty.CropToMask,
Visual.Property.VisualFittingMode,
ImageVisualProperty.SamplingMode,
ImageVisualProperty.DesiredWidth,
ImageVisualProperty.DesiredHeight,
ImageVisualProperty.ReleasePolicy,
Expand Down Expand Up @@ -1288,6 +1289,32 @@ private FittingModeType InternalFittingMode
}
}

/// <summary>
/// Gets or sets filtering options used when resizing images to the sample original pixels.<br />
/// If not supplied, the default is SamplingModeType.BoxThenLinear.<br />
/// For normal quad images only.<br />
/// Optional.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public SamplingModeType SamplingMode
{
get
{
int ret = (int)SamplingModeType.BoxThenLinear;

using PropertyValue samplingMode = GetCachedImageVisualProperty(ImageVisualProperty.SamplingMode);
samplingMode?.Get(out ret);

return (SamplingModeType)ret;
}
set
{
using PropertyValue setValue = new PropertyValue((int)value);
UpdateImage(ImageVisualProperty.SamplingMode, setValue);
NotifyPropertyChanged();
}
}

/// <summary>
/// This method allows users to configure the blending of two images(previous and currnet) using alpha values.
/// </summary>
Expand Down
12 changes: 11 additions & 1 deletion src/Tizen.NUI/src/public/Visuals/VisualConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,17 @@ public enum SamplingModeType
/// <summary>
/// For caching algorithms where a client strongly prefers a cache-hit to reuse a cached image.
/// </summary>
DontCare
DontCare,
/// <summary>
/// Use Lanczos resample algorithm.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
Lanczos,
/// <summary>
/// Iteratively box filter to generate an image of 1/2, 1/4, 1/8 etc width and height and approximately the desired size, then apply Lanczos resample algorithm.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
BoxThenLanczos,
}

/// <summary>
Expand Down
22 changes: 22 additions & 0 deletions src/Tizen.NUI/src/public/Visuals/VisualObject/ImageVisual.cs
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,28 @@ public ReleasePolicyType ReleasePolicy
}
}

/// <summary>
/// Gets or sets filtering options used when resizing images to the sample original pixels.<br />
/// If not supplied, the default is SamplingModeType.BoxThenLinear.<br />
/// For normal quad images only.<br />
/// Optional.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public SamplingModeType SamplingMode
{
set
{
UpdateVisualProperty((int)Tizen.NUI.ImageVisualProperty.SamplingMode, new PropertyValue((int)value));
}
get
{
int ret = (int)SamplingModeType.BoxThenLinear;
var propertyValue = GetCachedVisualProperty((int)Tizen.NUI.ImageVisualProperty.SamplingMode);
propertyValue?.Get(out ret);
return (SamplingModeType)ret;
}
}

/// <summary>
/// Gets or sets the desired image width.<br />
/// If not specified, the actual image width is used.<br />
Expand Down
66 changes: 66 additions & 0 deletions test/Tizen.NUI.Samples/Tizen.NUI.Samples/Samples/VisualTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,18 @@ private void WinKeyEvent(object sender, Window.KeyEventArgs e)
{
focusIndicatorVisual.ResourceUrl = focusIndicatorImageUrl;
}
else if(e.Key.KeyPressedName == "6")
{
View focusedView = FocusManager.Instance.GetCurrentFocusView();
if(focusedView != null)
{
var thumbnailVisual = focusedView.FindVisualByName("thumbnailImage") as Visuals.ImageVisual;
if(thumbnailVisual != null)
{
thumbnailVisual.SamplingMode = GetNextSamplingModeType(thumbnailVisual.SamplingMode);
}
}
}
}
}

Expand Down Expand Up @@ -314,6 +326,8 @@ private View CreateViewWithVisual(int id)

SynchronousSizing = true,

SamplingMode = SamplingModeType.BoxThenLanczos,

OffsetXPolicy = VisualTransformPolicyType.Absolute,
OffsetYPolicy = VisualTransformPolicyType.Absolute,
WidthPolicy = VisualTransformPolicyType.Absolute,
Expand Down Expand Up @@ -390,5 +404,57 @@ private View CreateViewWithVisual(int id)

return view;
}

static private SamplingModeType GetNextSamplingModeType(SamplingModeType currentSamplingMode)
{
SamplingModeType nextSamplingMode = SamplingModeType.DontCare;
switch(currentSamplingMode)
{
case SamplingModeType.Box:
{
nextSamplingMode = SamplingModeType.Nearest;
break;
}
case SamplingModeType.Nearest:
{
nextSamplingMode = SamplingModeType.Linear;
break;
}
case SamplingModeType.Linear:
{
nextSamplingMode = SamplingModeType.BoxThenNearest;
break;
}
case SamplingModeType.BoxThenNearest:
{
nextSamplingMode = SamplingModeType.BoxThenLinear;
break;
}
case SamplingModeType.BoxThenLinear:
{
nextSamplingMode = SamplingModeType.Lanczos;
break;
}
case SamplingModeType.Lanczos:
{
nextSamplingMode = SamplingModeType.BoxThenLanczos;
break;
}
case SamplingModeType.BoxThenLanczos:
{
nextSamplingMode = SamplingModeType.DontCare;
break;
}
case SamplingModeType.DontCare:
default:
{
nextSamplingMode = SamplingModeType.Box;
break;
}
}
Tizen.Log.Error("NUI", $"Change sampling mode from [{currentSamplingMode}] to [{nextSamplingMode}]\n");

return nextSamplingMode;
}
}
}
Loading