2 * Copyright(c) 2019 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 using System.ComponentModel;
18 using Tizen.NUI.BaseComponents;
23 /// A class encapsulating the transform map of the visual.
25 /// <since_tizen> 3 </since_tizen>
26 public class VisualMap
31 /// <since_tizen> 3 </since_tizen>
32 protected PropertyMap _outputVisualMap = null;
35 /// The shader of the visual.
37 /// <since_tizen> 3 </since_tizen>
38 protected PropertyMap _shader = null;
39 //private PropertyMap _transform = null;
42 /// The premultipliedAlpha of the visual.
44 /// <since_tizen> 3 </since_tizen>
45 protected bool? _premultipliedAlpha = null;
48 /// The mixColor of the Visual.
50 /// <since_tizen> 3 </since_tizen>
51 protected Color _mixColor = null;
54 /// The opacity of the visual.
56 /// <since_tizen> 3 </since_tizen>
57 protected float? _opacity = null;
60 /// The FittingMode of the visual.
62 /// <since_tizen> 5 </since_tizen>
63 protected VisualFittingModeType? _visualFittingMode = null;
66 /// The corner radius value of the visual.
68 [EditorBrowsable(EditorBrowsableState.Never)]
69 protected float? _cornerRadius = null;
72 /// The map for visual.
74 /// <since_tizen> 3 </since_tizen>
75 protected PropertyMap _commonlyUsedMap = null;
77 private Vector2 _visualSize = null;
78 private Vector2 _visualOffset = null;
79 private Vector2 _visualOffsetPolicy = null;
80 private Vector2 _visualSizePolicy = null;
81 private Visual.AlignType? _visualOrigin = null;
82 private Visual.AlignType? _visualAnchorPoint = null;
84 private PropertyMap _visualTransformMap = null;
86 private int? _depthIndex = null;
91 /// <since_tizen> 3 </since_tizen>
97 /// Gets or sets the size of the visual.<br />
98 /// It can be either relative (percentage of the parent)
99 /// or absolute (in world units).<br />
102 /// <since_tizen> 3 </since_tizen>
107 return _visualSize ?? (new Size2D(1, 1));
112 if (_visualSizePolicy == null)
114 _visualSizePolicy = new Vector2(1.0f, 1.0f);
121 /// Gets or sets the offset of the visual.<br />
122 /// It can be either relative (percentage of the parent)
123 /// or absolute (in world units).<br />
126 /// <since_tizen> 3 </since_tizen>
127 public Vector2 Position
131 return _visualOffset ?? (new Vector2(0.0f, 0.0f));
135 _visualOffset = value;
136 if (_visualOffsetPolicy == null)
138 _visualOffsetPolicy = new Vector2(1.0f, 1.0f);
145 /// Gets or sets the relative size of the visual<br />
146 /// (percentage [0.0f to 1.0f] of the control).<br />
149 /// <since_tizen> 3 </since_tizen>
150 public RelativeVector2 RelativeSize
154 return _visualSize ?? (new RelativeVector2(1.0f, 1.0f));
159 _visualSizePolicy = new Vector2(0.0f, 0.0f);
165 /// Gets or sets the relative offset of the visual<br />
166 /// (percentage [0.0f to 1.0f] of the control).<br />
169 /// <since_tizen> 3 </since_tizen>
170 public RelativeVector2 RelativePosition
174 return _visualOffset ?? (new RelativeVector2(0.0f, 0.0f));
178 _visualOffset = value;
179 _visualOffsetPolicy = new Vector2(0.0f, 0.0f);
185 /// Gets or sets whether the x and y offset values are relative<br />
186 /// (percentage [0.0f to 1.0f] of the control) or absolute (in world units).<br />
187 /// By default, both the x and the y offset are relative.<br />
190 /// <since_tizen> 3 </since_tizen>
191 public VisualTransformPolicyType PositionPolicy
195 if (_visualOffsetPolicy != null && _visualOffsetPolicy.X == 1.0f
196 && _visualOffsetPolicy.Y == 1.0f)
198 return VisualTransformPolicyType.Absolute;
200 return VisualTransformPolicyType.Relative;
206 case VisualTransformPolicyType.Relative:
207 _visualOffsetPolicy = new Vector2(0.0f, 0.0f);
209 case VisualTransformPolicyType.Absolute:
210 _visualOffsetPolicy = new Vector2(1.0f, 1.0f);
213 _visualOffsetPolicy = new Vector2(0.0f, 0.0f);
221 /// Gets or sets whether the x offset values are relative<br />
222 /// (percentage [0.0f to 1.0f] of the control) or absolute (in world units).<br />
223 /// By default, the x offset is relative.<br />
226 /// <since_tizen> 3 </since_tizen>
227 public VisualTransformPolicyType PositionPolicyX
231 if (_visualOffsetPolicy != null && _visualOffsetPolicy.X == 1.0f)
233 return VisualTransformPolicyType.Absolute;
235 return VisualTransformPolicyType.Relative;
239 if (_visualOffsetPolicy == null)
241 _visualOffsetPolicy = new Vector2(0.0f, 0.0f);
246 case VisualTransformPolicyType.Relative:
247 _visualOffsetPolicy.X = 0.0f;
249 case VisualTransformPolicyType.Absolute:
250 _visualOffsetPolicy.X = 1.0f;
253 _visualOffsetPolicy.X = 0.0f;
262 /// Gets or sets whether the y offset values are relative<br />
263 /// (percentage [0.0f to 1.0f] of the control) or absolute (in world units).<br />
264 /// By default, the y offset is relative.<br />
267 /// <since_tizen> 3 </since_tizen>
268 public VisualTransformPolicyType PositionPolicyY
272 if (_visualOffsetPolicy != null && _visualOffsetPolicy.Y == 1.0f)
274 return VisualTransformPolicyType.Absolute;
276 return VisualTransformPolicyType.Relative;
280 if (_visualOffsetPolicy == null)
282 _visualOffsetPolicy = new Vector2(0.0f, 0.0f);
287 case VisualTransformPolicyType.Relative:
288 _visualOffsetPolicy.Y = 0.0f;
290 case VisualTransformPolicyType.Absolute:
291 _visualOffsetPolicy.Y = 1.0f;
294 _visualOffsetPolicy.Y = 0.0f;
302 /// Gets or sets whether the size values of the width or the height are relative<br />
303 /// (percentage [0.0f to 1.0f] of the control) or absolute (in world units).<br />
304 /// By default, offsets of both the width and the height are relative to the control's size.<br />
307 /// <since_tizen> 3 </since_tizen>
308 public VisualTransformPolicyType SizePolicy
312 if (_visualSizePolicy != null && _visualSizePolicy.X == 1.0f
313 && _visualSizePolicy.Y == 1.0f)
315 return VisualTransformPolicyType.Absolute;
317 return VisualTransformPolicyType.Relative;
323 case VisualTransformPolicyType.Relative:
324 _visualSizePolicy = new Vector2(0.0f, 0.0f);
326 case VisualTransformPolicyType.Absolute:
327 _visualSizePolicy = new Vector2(1.0f, 1.0f);
330 _visualSizePolicy = new Vector2(0.0f, 0.0f);
338 /// Gets or sets whether size values of the width are relative.<br />
339 /// (percentage [0.0f to 1.0f] of the control) or absolute (in world units).<br />
340 /// By default, the value of the width is relative to the control's width.<br />
343 /// <since_tizen> 3 </since_tizen>
344 public VisualTransformPolicyType SizePolicyWidth
348 if (_visualSizePolicy != null && _visualSizePolicy.Width == 1.0f)
350 return VisualTransformPolicyType.Absolute;
352 return VisualTransformPolicyType.Relative;
356 if (_visualSizePolicy == null)
358 _visualSizePolicy = new Vector2(0.0f, 0.0f);
363 case VisualTransformPolicyType.Relative:
364 _visualSizePolicy.Width = 0.0f;
366 case VisualTransformPolicyType.Absolute:
367 _visualSizePolicy.Width = 1.0f;
370 _visualSizePolicy.Width = 0.0f;
378 /// Gets or sets whether size values of the height are relative<br />
379 /// (percentage [0.0f to 1.0f] of the control) or absolute (in world units).<br />
380 /// By default, the height value is relative to the control's height.<br />
383 /// <since_tizen> 3 </since_tizen>
384 public VisualTransformPolicyType SizePolicyHeight
388 if (_visualSizePolicy != null && _visualSizePolicy.Height == 1.0f)
390 return VisualTransformPolicyType.Absolute;
392 return VisualTransformPolicyType.Relative;
396 if (_visualSizePolicy == null)
398 _visualSizePolicy = new Vector2(0.0f, 0.0f);
403 case VisualTransformPolicyType.Relative:
404 _visualSizePolicy.Height = 0.0f;
406 case VisualTransformPolicyType.Absolute:
407 _visualSizePolicy.Height = 1.0f;
410 _visualSizePolicy.Height = 0.0f;
418 /// Gets or sets the origin of the visual within its control area.<br />
419 /// By default, the origin is center.<br />
422 /// <since_tizen> 3 </since_tizen>
423 public Visual.AlignType Origin
427 return _visualOrigin ?? (Visual.AlignType.Center);
431 _visualOrigin = value;
437 /// Gets or sets the anchor point of the visual.<br />
438 /// By default, the anchor point is center.<br />
441 /// <since_tizen> 3 </since_tizen>
442 public Visual.AlignType AnchorPoint
446 return _visualAnchorPoint ?? (Visual.AlignType.Center);
450 _visualAnchorPoint = value;
456 /// Gets or sets the depth index of the visual.<br />
457 /// By default, the depth index is 0.<br />
460 /// <since_tizen> 3 </since_tizen>
461 public int DepthIndex
465 return _depthIndex ?? (0);
474 /// Gets the transform map used by the visual.
476 /// <since_tizen> 3 </since_tizen>
477 public PropertyMap OutputTransformMap
481 ComposingTransformMap();
482 return _visualTransformMap;
487 /// Gets the property map to create the visual.
489 /// <since_tizen> 3 </since_tizen>
490 public PropertyMap OutputVisualMap
494 ComposingPropertyMap();
495 return _outputVisualMap;
501 /// The shader to use in the visual.
503 /// <since_tizen> 3 </since_tizen>
504 public PropertyMap Shader
518 /// Enables or disables the premultiplied alpha. <br />
519 /// The premultiplied alpha is false by default unless this behavior is modified by the derived visual type.
521 /// <since_tizen> 3 </since_tizen>
522 public bool PremultipliedAlpha
526 return _premultipliedAlpha ?? (false);
530 _premultipliedAlpha = value;
536 /// Mix color is a blend color for any visual.
538 /// <since_tizen> 3 </since_tizen>
539 public Color MixColor
553 /// Opacity is the alpha component of the mix color discussed above.
555 /// <since_tizen> 3 </since_tizen>
560 return _opacity ?? (1.0f);
570 /// The fitting mode of the visual.
571 /// The default is defined by the type of visual (if it is suitable to be stretched or not).
573 /// <since_tizen> 5 </since_tizen>
574 public VisualFittingModeType VisualFittingMode
578 if (_visualFittingMode == null)
580 if (this is AnimatedImageVisual ||
581 this is MeshVisual ||
582 this is PrimitiveVisual ||
585 return VisualFittingModeType.FitKeepAspectRatio;
589 return VisualFittingModeType.Fill;
594 return (VisualFittingModeType)_visualFittingMode;
599 _visualFittingMode = value;
605 /// The corner radius of the visual.
607 [EditorBrowsable(EditorBrowsableState.Never)]
608 public float CornerRadius
612 return _cornerRadius ?? (0.0f);
616 _cornerRadius = value;
627 internal int VisualIndex
633 internal VisualView Parent
640 /// Suppress UpdateVisual() to update properties to Parent.
641 /// If it is set to true, UpdateVisual() is ignored unless it is called with force.
643 internal bool SuppressUpdateVisual { get; set; } = false;
645 internal void UpdateVisual(bool force = false)
647 if (VisualIndex > 0 && (!SuppressUpdateVisual || force))
649 NUILog.Debug("UpdateVisual()! VisualIndex=" + VisualIndex);
650 Parent.UpdateVisual(VisualIndex, Name, this);
654 NUILog.Debug("VisualIndex was not set");
659 /// Compose the out visual map.
661 /// <since_tizen> 3 </since_tizen>
662 protected virtual void ComposingPropertyMap()
664 if (null == _outputVisualMap)
666 _outputVisualMap = new PropertyMap();
669 if (_shader != null) { _outputVisualMap.Add(Visual.Property.Shader, new PropertyValue(_shader)); }
670 if (_premultipliedAlpha != null) { _outputVisualMap.Add(Visual.Property.PremultipliedAlpha, new PropertyValue((bool)_premultipliedAlpha)); }
671 if (_mixColor != null) { _outputVisualMap.Add(Visual.Property.MixColor, new PropertyValue(_mixColor)); }
672 if (_opacity != null) { _outputVisualMap.Add(Visual.Property.Opacity, new PropertyValue((float)_opacity)); }
673 if (_visualFittingMode != null) { _outputVisualMap.Add(Visual.Property.VisualFittingMode, new PropertyValue((int)_visualFittingMode)); }
674 if (_cornerRadius != null) { _outputVisualMap.Add(Visual.Property.CornerRadius, new PropertyValue((int)_cornerRadius)); }
677 private void ComposingTransformMap()
679 _visualTransformMap = new PropertyMap();
680 if (_visualSize != null) { _visualTransformMap.Add((int)VisualTransformPropertyType.Size, new PropertyValue(_visualSize)); }
681 if (_visualOffset != null) { _visualTransformMap.Add((int)VisualTransformPropertyType.Offset, new PropertyValue(_visualOffset)); }
682 if (_visualOffsetPolicy != null) { _visualTransformMap.Add((int)VisualTransformPropertyType.OffsetPolicy, new PropertyValue(_visualOffsetPolicy)); }
683 if (_visualSizePolicy != null) { _visualTransformMap.Add((int)VisualTransformPropertyType.SizePolicy, new PropertyValue(_visualSizePolicy)); }
684 if (_visualOrigin != null) { _visualTransformMap.Add((int)VisualTransformPropertyType.Origin, new PropertyValue((int)_visualOrigin)); }
685 if (_visualAnchorPoint != null) { _visualTransformMap.Add((int)VisualTransformPropertyType.AnchorPoint, new PropertyValue((int)_visualAnchorPoint)); }