Release 4.0.0-preview1-00201
[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);
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
76         internal EcoreDisplaySetter(IntPtr windowHandle)
77         {
78             _windowHandle = windowHandle;
79         }
80
81         public TError SetDisplay<TError>(IDisplayable<TError> target)
82         {
83             return target.ApplyEcoreWindow(_windowHandle);
84         }
85     }
86
87     /// <summary>
88     /// Provides a means to wrap various display types.
89     /// </summary>
90     /// <seealso cref="Player"/>
91     /// <seealso cref="Camera"/>
92     /// <seealso cref="Tizen.Multimedia.Remoting.ScreenMirroring"/>
93     public class Display
94     {
95         private readonly IDisplaySetter _setter;
96
97         /// <summary>
98         /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="MediaView"/> class.
99         /// </summary>
100         /// <param name="mediaView">A <see cref="MediaView"/> to display.</param>
101         /// <feature>http://tizen.org/feature/multimedia.raw_video</feature>
102         /// <exception cref="NotSupportedException">The required feature is not supported.</exception>
103         public Display(MediaView mediaView)
104         {
105             ValidationUtil.ValidateFeatureSupported(Features.RawVideo);
106
107             if (mediaView == null)
108             {
109                 throw new ArgumentNullException(nameof(mediaView));
110             }
111
112             _setter = new EvasDisplaySetter(DisplayType.Surface, mediaView);
113         }
114
115         /// <summary>
116         /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="Window"/> class.
117         /// </summary>
118         /// <param name="window">A <see cref="Window"/> to display.</param>
119         public Display(Window window)
120         {
121             if (window == null)
122             {
123                 throw new ArgumentNullException(nameof(window));
124             }
125
126             _setter = new EvasDisplaySetter(DisplayType.Overlay, window);
127         }
128
129         /// <summary>
130         /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="NUI.Window"/> class.
131         /// </summary>
132         /// <param name="window">A <see cref="NUI.Window"/> to display.</param>
133         /// <remarks>
134         /// The <see cref="NUI.Window.BackgroundColor"/> must be <see cref="NUI.Color.Transparent"/>
135         /// for the <see cref="Display"/> to be rendered correctly.
136         /// </remarks>
137         public Display(NUI.Window window)
138         {
139             if (window == null)
140             {
141                 throw new ArgumentNullException(nameof(window));
142             }
143
144             _setter = new EcoreDisplaySetter(window.GetNativeWindowHandler());
145         }
146
147         private EvasObject EvasObject { get; }
148
149         private DisplayType Type { get; }
150
151         private object _owner;
152
153         internal object Owner => _owner;
154
155         internal void SetOwner(object newOwner)
156         {
157             if (_owner != null && newOwner != null)
158             {
159                 throw new ArgumentException("The display has already been assigned to another.");
160             }
161
162             _owner = newOwner;
163         }
164
165         internal TError ApplyTo<TError>(IDisplayable<TError> target)
166         {
167             return _setter.SetDisplay(target);
168         }
169     }
170 }