a5c81c866179bbe5e2d525b6821847ed76d4417f
[platform/core/csapi/tizenfx.git] / src / Tizen.Multimedia / Common / Display.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 using System;
17 using ElmSharp;
18
19 namespace Tizen.Multimedia
20 {
21     internal enum DisplayType
22     {
23         /// <summary>
24         /// Overlay surface display.
25         /// </summary>
26         Overlay,
27
28         /// <summary>
29         ///  Evas image object surface display.
30         /// </summary>
31         Surface,
32
33         /// <summary>
34         /// This disposes off buffers.
35         /// </summary>
36         None,
37     }
38
39     internal interface IDisplayable<TError>
40     {
41         TError ApplyEvasDisplay(DisplayType type, EvasObject evasObject);
42         TError ApplyEcoreWindow(IntPtr windowHandle, NUI.Rectangle rect);
43     }
44
45     internal interface IDisplaySetter
46     {
47         TError SetDisplay<TError>(IDisplayable<TError> target);
48     }
49
50     internal class EvasDisplaySetter : IDisplaySetter
51     {
52         private readonly DisplayType _type;
53         private readonly EvasObject _target;
54
55         internal EvasDisplaySetter(DisplayType type, EvasObject target)
56         {
57             if (target == IntPtr.Zero)
58             {
59                 throw new ArgumentException("The evas object is not realized.");
60             }
61
62             _type = type;
63             _target = target;
64         }
65
66         public TError SetDisplay<TError>(IDisplayable<TError> target)
67         {
68             return target.ApplyEvasDisplay(_type, _target);
69         }
70     }
71
72     internal class EcoreDisplaySetter : IDisplaySetter
73     {
74         private readonly IntPtr _windowHandle;
75         private readonly NUI.Rectangle _rect;
76
77         internal EcoreDisplaySetter(IntPtr windowHandle, NUI.Rectangle rect)
78         {
79             _windowHandle = windowHandle;
80             _rect = rect;
81         }
82
83         public TError SetDisplay<TError>(IDisplayable<TError> target)
84         {
85             return target.ApplyEcoreWindow(_windowHandle, _rect);
86         }
87     }
88
89     /// <summary>
90     /// Provides a means to wrap various display types.
91     /// </summary>
92     /// <seealso cref="T:Tizen.Multimedia.Player"/>
93     /// <seealso cref="T:Tizen.Multimedia.Camera"/>
94     /// <seealso cref="T:Tizen.Multimedia.Remoting.ScreenMirroring"/>
95     /// <since_tizen> 3 </since_tizen>
96     public class Display
97     {
98         private readonly IDisplaySetter _setter;
99
100         /// <summary>
101         /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="MediaView"/> class.
102         /// </summary>
103         /// <param name="mediaView">A <see cref="MediaView"/> to display.</param>
104         /// <since_tizen> 3 </since_tizen>
105         [Obsolete("Deprecated in API10; Will be removed in API12")]
106         public Display(MediaView mediaView)
107         {
108             if (mediaView == null)
109             {
110                 throw new ArgumentNullException(nameof(mediaView));
111             }
112
113             _setter = new EvasDisplaySetter(DisplayType.Surface, mediaView);
114
115             HasMediaView = true;
116         }
117
118         /// <summary>
119         /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="Window"/> class.
120         /// </summary>
121         /// <param name="window">A <see cref="Window"/> to display.</param>
122         /// <since_tizen> 3 </since_tizen>
123         [Obsolete("Deprecated in API10; Will be removed in API12")]
124         public Display(Window window)
125         {
126             if (window == null)
127             {
128                 throw new ArgumentNullException(nameof(window));
129             }
130
131             _setter = new EvasDisplaySetter(DisplayType.Overlay, window);
132         }
133
134         /// <summary>
135         /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="NUI.Window"/> class.
136         /// </summary>
137         /// <param name="window">A <see cref="NUI.Window"/> to display.</param>
138         /// <remarks>
139         /// The <see cref="NUI.Window.BackgroundColor"/> must be <see cref="NUI.Color.Transparent"/>
140         /// for the <see cref="Display"/> to be rendered correctly.
141         /// </remarks>
142         /// <since_tizen> 3 </since_tizen>
143         public Display(NUI.Window window)
144             : this (window, false)
145         {
146         }
147
148         /// <summary>
149         /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="NUI.Window"/> class.
150         /// </summary>
151         /// <param name="window">A <see cref="NUI.Window"/> to display.</param>
152         /// <param name="uiSync">A value indicates whether video and UI is in sync or not.</param>
153         /// <remarks>
154         /// The <see cref="NUI.Window.BackgroundColor"/> must be <see cref="NUI.Color.Transparent"/>
155         /// for the <see cref="Display"/> to be rendered correctly.<br/>
156         /// UI sync is only for <see cref="T:Tizen.Multimedia.Player"/> and
157         /// <see cref="T:Tizen.Multimedia.Player.DisplaySettings"/> will not work in UI sync mode.
158         /// </remarks>
159         /// <since_tizen> 9 </since_tizen>
160         public Display(NUI.Window window, bool uiSync)
161         {
162             if (window == null)
163             {
164                 throw new ArgumentNullException(nameof(window));
165             }
166             _setter = new EcoreDisplaySetter(window.GetNativeWindowHandler(), window.WindowPositionSize);
167
168             UiSync = uiSync;
169         }
170
171         private EvasObject EvasObject { get; }
172
173         private DisplayType Type { get; }
174
175         private object _owner;
176
177         internal bool HasMediaView { get; } = false;
178
179         internal bool UiSync { get; } = false;
180
181         internal object Owner => _owner;
182
183         internal void SetOwner(object newOwner)
184         {
185             if (_owner != null && newOwner != null)
186             {
187                 throw new ArgumentException("The display has already been assigned to another.");
188             }
189
190             _owner = newOwner;
191         }
192
193         internal TError ApplyTo<TError>(IDisplayable<TError> target)
194         {
195             return _setter.SetDisplay(target);
196         }
197     }
198 }