本文共 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标签的应用 ## 构造函数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/