📄 html_imageimpl.cpp
字号:
void HTMLImageElementImpl::attach(){ HTMLElementImpl::attach(); if (renderer()) { RenderImage* imageObj = static_cast<RenderImage*>(renderer()); imageObj->setImage(m_imageLoader.image()); } if (getDocument()->isHTMLDocument()) { HTMLDocumentImpl *document = static_cast<HTMLDocumentImpl *>(getDocument()); document->addNamedImageOrForm(oldIdAttr); document->addNamedImageOrForm(oldNameAttr); }}void HTMLImageElementImpl::detach(){ if (getDocument()->isHTMLDocument()) { HTMLDocumentImpl *document = static_cast<HTMLDocumentImpl *>(getDocument()); document->removeNamedImageOrForm(oldIdAttr); document->removeNamedImageOrForm(oldNameAttr); } HTMLElementImpl::detach();}long HTMLImageElementImpl::width() const{ if (!m_render) { // check the attribute first for an explicit pixel value DOM::DOMString attrWidth = getAttribute(ATTR_WIDTH); bool ok; long width = attrWidth.string().toLong(&ok); if (ok) { return width; } } DOM::DocumentImpl* docimpl = getDocument(); if (docimpl) { docimpl->updateLayout(); } if (!m_render) { return 0; } return m_render->contentWidth();}long HTMLImageElementImpl::height() const{ if (!m_render) { // check the attribute first for an explicit pixel value DOM::DOMString attrHeight = getAttribute(ATTR_HEIGHT); bool ok; long height = attrHeight.string().toLong(&ok); if (ok) { return height; } } DOM::DocumentImpl* docimpl = getDocument(); if (docimpl) { docimpl->updateLayout(); } if (!m_render) { return 0; } return m_render->contentHeight();}QImage HTMLImageElementImpl::currentImage() const{ RenderImage *r = static_cast<RenderImage*>(renderer()); if (r) return r->pixmap().convertToImage(); return QImage();}bool HTMLImageElementImpl::isURLAttribute(AttributeImpl *attr) const{ return (attr->id() == ATTR_SRC || (attr->id() == ATTR_USEMAP && attr->value().domString()[0] != '#'));}// -------------------------------------------------------------------------HTMLMapElementImpl::HTMLMapElementImpl(DocumentPtr *doc) : HTMLElementImpl(doc){}HTMLMapElementImpl::~HTMLMapElementImpl(){ if (getDocument()) getDocument()->removeImageMap(this);}NodeImpl::Id HTMLMapElementImpl::id() const{ return ID_MAP;}boolHTMLMapElementImpl::mapMouseEvent(int x_, int y_, int width_, int height_, RenderObject::NodeInfo& info){ //cout << "map:mapMouseEvent " << endl; //cout << x_ << " " << y_ <<" "<< width_ <<" "<< height_ << endl; QPtrStack<NodeImpl> nodeStack; NodeImpl *current = firstChild(); while(1) { if(!current) { if(nodeStack.isEmpty()) break; current = nodeStack.pop(); current = current->nextSibling(); continue; } if(current->id()==ID_AREA) { //cout << "area found " << endl; HTMLAreaElementImpl* area=static_cast<HTMLAreaElementImpl*>(current); if (area->mapMouseEvent(x_,y_,width_,height_, info)) return true; } NodeImpl *child = current->firstChild(); if(child) { nodeStack.push(current); current = child; } else { current = current->nextSibling(); } } return false;}void HTMLMapElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr){ switch (attr->id()) { case ATTR_ID: // Must call base class so that hasID bit gets set. HTMLElementImpl::parseHTMLAttribute(attr); if (getDocument()->htmlMode() != DocumentImpl::XHtml) break; // fall through case ATTR_NAME: getDocument()->removeImageMap(this); name = attr->value(); if (name.length() != 0 && name[0] == '#') name.remove(0, 1); getDocument()->addImageMap(this); break; default: HTMLElementImpl::parseHTMLAttribute(attr); }}// -------------------------------------------------------------------------HTMLAreaElementImpl::HTMLAreaElementImpl(DocumentPtr *doc) : HTMLAnchorElementImpl(doc){ m_coords=0; m_coordsLen = 0; shape = Unknown; lasth = lastw = -1;}HTMLAreaElementImpl::~HTMLAreaElementImpl(){ if (m_coords) delete [] m_coords;}NodeImpl::Id HTMLAreaElementImpl::id() const{ return ID_AREA;}void HTMLAreaElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr){ switch (attr->id()) { case ATTR_SHAPE: if ( strcasecmp( attr->value(), "default" ) == 0 ) shape = Default; else if ( strcasecmp( attr->value(), "circle" ) == 0 ) shape = Circle; else if ( strcasecmp( attr->value(), "poly" ) == 0 ) shape = Poly; else if ( strcasecmp( attr->value(), "rect" ) == 0 ) shape = Rect; break; case ATTR_COORDS: if (m_coords) delete [] m_coords; m_coords = attr->value().toLengthArray(m_coordsLen); break; case ATTR_TARGET: m_hasTarget = !attr->isNull(); break; case ATTR_ALT: break; case ATTR_ACCESSKEY: break; default: HTMLAnchorElementImpl::parseHTMLAttribute(attr); }}bool HTMLAreaElementImpl::mapMouseEvent(int x_, int y_, int width_, int height_, RenderObject::NodeInfo& info){ bool inside = false; if (width_ != lastw || height_ != lasth) { region=getRegion(width_, height_); lastw=width_; lasth=height_; } if (region.contains(QPoint(x_,y_))) { inside = true; info.setInnerNode(this); info.setURLElement(this); } return inside;}QRect HTMLAreaElementImpl::getRect(RenderObject* obj) const{ int dx, dy; obj->absolutePosition(dx, dy); QRegion region = getRegion(lastw,lasth); region.translate(dx, dy); return region.boundingRect();}QRegion HTMLAreaElementImpl::getRegion(int width_, int height_) const{ QRegion region; if (!m_coords) return region; // added broken HTML support (Dirk): some pages omit the SHAPE // attribute, so we try to guess by looking at the coords count // what the HTML author tried to tell us. // a Poly needs at least 3 points (6 coords), so this is correct if ((shape==Poly || shape==Unknown) && m_coordsLen > 5) { // make sure its even int len = m_coordsLen >> 1; QPointArray points(len); for (int i = 0; i < len; ++i) points.setPoint(i, m_coords[(i<<1)].minWidth(width_), m_coords[(i<<1)+1].minWidth(height_)); region = QRegion(points); } else if (shape==Circle && m_coordsLen>=3 || shape==Unknown && m_coordsLen == 3) { int r = kMin(m_coords[2].minWidth(width_), m_coords[2].minWidth(height_)); region = QRegion(m_coords[0].minWidth(width_)-r, m_coords[1].minWidth(height_)-r, 2*r, 2*r,QRegion::Ellipse); } else if (shape==Rect && m_coordsLen>=4 || shape==Unknown && m_coordsLen == 4) { int x0 = m_coords[0].minWidth(width_); int y0 = m_coords[1].minWidth(height_); int x1 = m_coords[2].minWidth(width_); int y1 = m_coords[3].minWidth(height_); region = QRegion(x0,y0,x1-x0,y1-y0); } else if (shape==Default) region = QRegion(0,0,width_,height_); // else // return null region return region;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -