博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebKit之Canvas的源码初步分析1
阅读量:4025 次
发布时间:2019-05-24

本文共 2798 字,大约阅读时间需要 9 分钟。

●HTMLCanvasElement.idl[    JSGenerateToNativeObject] interface HTMLCanvasElement : HTMLElement {    attribute long width;    attribute long height;    [Custom, RaisesException] DOMString toDataURL([TreatNullAs=NullString,                                                   TreatUndefinedAs=NullString,                                                  Default=Undefined] optional DOMString type);#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C    // The custom binding is needed to handle context creation attributes.    [Custom] any getContext([Default=Undefined] optional DOMString contextId);    [Custom] any supportsContext([Default=Undefined] optional DOMString contextId);#endif#endif};●Html5中canvas标签的应用
test
## 构造函数HTMLCanvasElement::HTMLCanvasElement(const QualifiedName& tagName, Document* document):TMLElement(tagName, document){}## 创建RenderObject对象RenderObject* HTMLCanvasElement::createRenderer(RenderArena* arena, RenderStyle* style){ return new (arena) RenderHTMLCanvas(this);}## 附着的行为void HTMLCanvasElement::attach(const AttachContext& context)>>HTMLElement::attach(context);>>附着行为基本交给父类进行## CanvasObserver观察元素的变化void HTMLCanvasElement::addObserver(CanvasObserver* observer)>>m_observers.add(observer);void HTMLCanvasElement::removeObserver(CanvasObserver* observer)>>m_observers.remove(observer);## 创建Canvas的渲染上下文CanvasRenderingContext* HTMLCanvasElement::getContext(const String& type, CanvasContextAttributes* attrs){ m_context = CanvasRenderingContext2D::create(this, document()->inQuirksMode(), usesDashbardCompatibilityMode);#if ENABLE(WEBGL) m_context = WebGLRenderingContext::create(this, static_cast
(attrs));#endif}## 触发绘画事件void HTMLCanvasElement::didDraw(const FloatRect& rect){ clearCopiedImage(); FloatRect destRect = ro->contentBoxRect(); FloatRect r = mapRect(rect, FloatRect(0, 0, size().width(), size().height()), destRect); r.intersect(destRect); m_dirtyRect.unite(r); ro->repaintRectangle(enclosingIntRect(m_dirtyRect)); notifyObserversCanvasChanged(rect);}## 通知观察者Canvas状态变化void HTMLCanvasElement::notifyObserversCanvasChanged(const FloatRect& rect){ for (HashSet
::iterator it = m_observers.begin(); it != end; ++it) *it)->canvasChanged(this, rect);}## 具体的绘制逻辑void HTMLCanvasElement::paint(GraphicsContext* context, const LayoutRect& r, bool useLowQualityScale){ m_context->paintRenderingResultsToCanvas(); ImageBuffer* imageBuffer = buffer(); context->drawImage(m_presentedImage.get(), ColorSpaceDeviceRGB, pixelSnappedIntRect(r), CompositeSourceOver, DoNotRespectImageOrientation, useLowQualityScale);}## 图形上下文GraphicsContext* HTMLCanvasElement::drawingContext() const{ return buffer() ? m_imageBuffer->context() : 0;}class CanvasRenderingContext : public ScriptWrappable {}

转载地址:http://qcvbi.baihongyu.com/

你可能感兴趣的文章
创业公司如何与巨头竞争?利用好这9大优势是关键
查看>>
读书 | 如何像沉迷游戏一样对工作上瘾?
查看>>
如何确保自己的Mac数据安全呢?这里有四个“小秘诀”
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
第一性原理:戳中问题本质的人是怎么思考的?
查看>>
No.147 - LeetCode1108
查看>>
No.148 - LeetCode771
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
FE:http状态码
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mac:移动python包路径
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql alter table 修改列属性的字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>