⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 html_imageimpl.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -