HtmlCanvasElement
sealed class HtmlCanvasElement : HtmlElement, IHtmlCanvasElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle
Represents the HTML canvas element.
See: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html
Alternative: http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#the-canvas-element
using AngleSharp.Dom.Css;
using AngleSharp.Dom.Media;
using AngleSharp.Extensions;
using AngleSharp.Html;
using AngleSharp.Network;
using AngleSharp.Services;
using System;
using System.IO;
namespace AngleSharp.Dom.Html
{
internal sealed class HtmlCanvasElement : HtmlElement, IHtmlCanvasElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle
{
private enum ContextMode
{
None,
Direct2d,
DirectWebGl,
Indirect,
Proxied
}
private ContextMode _mode;
private IRenderingContext _current;
public int Width {
get {
return GetOwnAttribute(AttributeNames.Width).ToInteger(300);
}
set {
SetOwnAttribute(AttributeNames.Width, value.ToString());
}
}
public int Height {
get {
return GetOwnAttribute(AttributeNames.Height).ToInteger(150);
}
set {
SetOwnAttribute(AttributeNames.Height, value.ToString());
}
}
public HtmlCanvasElement(Document owner, string prefix = null)
: base(owner, Tags.Canvas, prefix, NodeFlags.None)
{
_mode = ContextMode.None;
}
public IRenderingContext GetContext(string contextId)
{
if (_current != null && _current.ContextId.Equals(contextId, StringComparison.OrdinalIgnoreCase))
return _current;
IRenderingService service = base.Owner.Options.GetService<IRenderingService>();
if (service == null)
return null;
IRenderingContext renderingContext = service.CreateContext(contextId);
if (renderingContext != null) {
renderingContext.Host = this;
_mode = GetModeFrom(contextId);
_current = renderingContext;
}
return renderingContext;
}
public bool IsSupportingContext(string contextId)
{
return base.Owner.Options.GetService<IRenderingService>()?.IsSupportingContext(contextId) ?? false;
}
public void SetContext(IRenderingContext context)
{
if (_mode != 0 && _mode != ContextMode.Indirect)
throw new DomException(DomError.InvalidState);
if (context.IsFixed)
throw new DomException(DomError.InvalidState);
context.Host = this;
_current = context;
_mode = ContextMode.Indirect;
}
public string ToDataUrl(string type = null)
{
byte[] imageData = GetImageData(type);
return Convert.ToBase64String(imageData);
}
public void ToBlob(Action<Stream> callback, string type = null)
{
byte[] imageData = GetImageData(type);
MemoryStream obj = new MemoryStream(imageData);
callback(obj);
}
private byte[] GetImageData(string type)
{
if (_current == null)
return new byte[0];
return _current.ToImage(type ?? MimeTypes.Plain);
}
private static ContextMode GetModeFrom(string contextId)
{
if (contextId.Equals("2d", StringComparison.OrdinalIgnoreCase))
return ContextMode.Direct2d;
if (contextId.Equals("webgl", StringComparison.OrdinalIgnoreCase))
return ContextMode.DirectWebGl;
return ContextMode.None;
}
}
}