css_valueimpl.cpp

来自「konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版」· C++ 代码 · 共 1,010 行 · 第 1/2 页

CPP
1,010
字号
}void CSSPrimitiveValueImpl::cleanup(){    switch(m_type) {    case CSSPrimitiveValue::CSS_STRING:    case CSSPrimitiveValue::CSS_URI:    case CSSPrimitiveValue::CSS_ATTR:	if(m_value.string) m_value.string->deref();        break;    case CSSPrimitiveValue::CSS_COUNTER:	m_value.counter->deref();        break;    case CSSPrimitiveValue::CSS_RECT:	m_value.rect->deref();    default:        break;    }    m_type = 0;}int CSSPrimitiveValueImpl::computeLength( khtml::RenderStyle *style, QPaintDeviceMetrics *devMetrics ){    double result = computeLengthFloat( style, devMetrics );    // This conversion is imprecise, often resulting in values of, e.g., 44.99998.  We    // need to go ahead and round if we're really close to the next integer value.    int intResult = (int)(result + (result < 0 ? -0.01 : +0.01));    return intResult;}double CSSPrimitiveValueImpl::computeLengthFloat( khtml::RenderStyle *style, QPaintDeviceMetrics *devMetrics ){    unsigned short type = primitiveType();    double dpiY = 72.; // fallback    if ( devMetrics )        dpiY = devMetrics->logicalDpiY();    if ( !khtml::printpainter && dpiY < 96 )        dpiY = 96.;    double factor = 1.;    switch(type)    {    case CSSPrimitiveValue::CSS_EMS:        factor = style->font().pixelSize();        break;    case CSSPrimitiveValue::CSS_EXS:	{        QFontMetrics fm = style->fontMetrics();#ifdef APPLE_CHANGES        factor = fm.xHeight();#else        QRect b = fm.boundingRect('x');        factor = b.height();#endif        break;	}    case CSSPrimitiveValue::CSS_PX:        break;    case CSSPrimitiveValue::CSS_CM:	factor = dpiY/2.54; //72dpi/(2.54 cm/in)        break;    case CSSPrimitiveValue::CSS_MM:	factor = dpiY/25.4;        break;    case CSSPrimitiveValue::CSS_IN:        factor = dpiY;        break;    case CSSPrimitiveValue::CSS_PT:        factor = dpiY/72.;        break;    case CSSPrimitiveValue::CSS_PC:        // 1 pc == 12 pt        factor = dpiY*12./72.;        break;    default:        return -1;    }    return floatValue(type)*factor;}void CSSPrimitiveValueImpl::setFloatValue( unsigned short unitType, double floatValue, int &exceptioncode ){    exceptioncode = 0;    cleanup();    // ### check if property supports this type    if(m_type > CSSPrimitiveValue::CSS_DIMENSION) {	exceptioncode = CSSException::SYNTAX_ERR + CSSException::_EXCEPTION_OFFSET;	return;    }    //if(m_type > CSSPrimitiveValue::CSS_DIMENSION) throw DOMException(DOMException::INVALID_ACCESS_ERR);    m_value.num = floatValue;    m_type = unitType;}void CSSPrimitiveValueImpl::setStringValue( unsigned short stringType, const DOMString &stringValue, int &exceptioncode ){    exceptioncode = 0;    cleanup();    //if(m_type < CSSPrimitiveValue::CSS_STRING) throw DOMException(DOMException::INVALID_ACCESS_ERR);    //if(m_type > CSSPrimitiveValue::CSS_ATTR) throw DOMException(DOMException::INVALID_ACCESS_ERR);    if(m_type < CSSPrimitiveValue::CSS_STRING || m_type > CSSPrimitiveValue::CSS_ATTR) {	exceptioncode = CSSException::SYNTAX_ERR + CSSException::_EXCEPTION_OFFSET;	return;    }    if(stringType != CSSPrimitiveValue::CSS_IDENT)    {	m_value.string = stringValue.implementation();	m_value.string->ref();	m_type = stringType;    }    // ### parse ident}unsigned short CSSPrimitiveValueImpl::cssValueType() const{    return CSSValue::CSS_PRIMITIVE_VALUE;}bool CSSPrimitiveValueImpl::parseString( const DOMString &/*string*/, bool ){    // ###    kdDebug() << "WARNING: CSSPrimitiveValueImpl::parseString, unimplemented, was called" << endl;    return false;}int CSSPrimitiveValueImpl::getIdent(){    if(m_type != CSSPrimitiveValue::CSS_IDENT) return 0;    return m_value.ident;}DOM::DOMString CSSPrimitiveValueImpl::cssText() const{    // ### return the original value instead of a generated one (e.g. color    // name if it was specified) - check what spec says about this    DOMString text;    switch ( m_type ) {	case CSSPrimitiveValue::CSS_UNKNOWN:	    // ###	    break;	case CSSPrimitiveValue::CSS_NUMBER:	    text = DOMString(QString::number( (int)m_value.num ));	    break;	case CSSPrimitiveValue::CSS_PERCENTAGE:	    text = DOMString(QString::number( m_value.num ) + "%");	    break;	case CSSPrimitiveValue::CSS_EMS:	    text = DOMString(QString::number( m_value.num ) + "em");	    break;	case CSSPrimitiveValue::CSS_EXS:	    text = DOMString(QString::number( m_value.num ) + "ex");	    break;	case CSSPrimitiveValue::CSS_PX:	    text = DOMString(QString::number( m_value.num ) + "px");	    break;	case CSSPrimitiveValue::CSS_CM:	    text = DOMString(QString::number( m_value.num ) + "cm");	    break;	case CSSPrimitiveValue::CSS_MM:	    text = DOMString(QString::number( m_value.num ) + "mm");	    break;	case CSSPrimitiveValue::CSS_IN:	    text = DOMString(QString::number( m_value.num ) + "in");	    break;	case CSSPrimitiveValue::CSS_PT:	    text = DOMString(QString::number( m_value.num ) + "pt");	    break;	case CSSPrimitiveValue::CSS_PC:	    text = DOMString(QString::number( m_value.num ) + "pc");	    break;	case CSSPrimitiveValue::CSS_DEG:	    text = DOMString(QString::number( m_value.num ) + "deg");	    break;	case CSSPrimitiveValue::CSS_RAD:	    text = DOMString(QString::number( m_value.num ) + "rad");	    break;	case CSSPrimitiveValue::CSS_GRAD:	    text = DOMString(QString::number( m_value.num ) + "grad");	    break;	case CSSPrimitiveValue::CSS_MS:	    text = DOMString(QString::number( m_value.num ) + "ms");	    break;	case CSSPrimitiveValue::CSS_S:	    text = DOMString(QString::number( m_value.num ) + "s");	    break;	case CSSPrimitiveValue::CSS_HZ:	    text = DOMString(QString::number( m_value.num ) + "hz");	    break;	case CSSPrimitiveValue::CSS_KHZ:	    text = DOMString(QString::number( m_value.num ) + "khz");	    break;	case CSSPrimitiveValue::CSS_DIMENSION:	    // ###	    break;	case CSSPrimitiveValue::CSS_STRING:	    // ###	    break;	case CSSPrimitiveValue::CSS_URI:            text  = "url(";	    text += DOMString( m_value.string );            text += ")";	    break;	case CSSPrimitiveValue::CSS_IDENT:	    text = getValueName(m_value.ident);	    break;	case CSSPrimitiveValue::CSS_ATTR:	    // ###	    break;	case CSSPrimitiveValue::CSS_COUNTER:            text = "counter(";            text += m_value.counter->m_identifier;            text += ")";            // ### add list-style and separator	    break;	case CSSPrimitiveValue::CSS_RECT:        {            RectImpl* rectVal = getRectValue();            text = "rect(";            text += rectVal->top()->cssText() + " ";            text += rectVal->right()->cssText() + " ";            text += rectVal->bottom()->cssText() + " ";            text += rectVal->left()->cssText() + ")";        }        break;	case CSSPrimitiveValue::CSS_RGBCOLOR:	    text = QColor(m_value.rgbcolor).name();	    break;	default:	    break;    }    return text;}// -----------------------------------------------------------------RectImpl::RectImpl(){    m_top = 0;    m_right = 0;    m_bottom = 0;    m_left = 0;}RectImpl::~RectImpl(){    if (m_top) m_top->deref();    if (m_right) m_right->deref();    if (m_bottom) m_bottom->deref();    if (m_left) m_left->deref();}void RectImpl::setTop( CSSPrimitiveValueImpl *top ){    if( top ) top->ref();    if ( m_top ) m_top->deref();    m_top = top;}void RectImpl::setRight( CSSPrimitiveValueImpl *right ){    if( right ) right->ref();    if ( m_right ) m_right->deref();    m_right = right;}void RectImpl::setBottom( CSSPrimitiveValueImpl *bottom ){    if( bottom ) bottom->ref();    if ( m_bottom ) m_bottom->deref();    m_bottom = bottom;}void RectImpl::setLeft( CSSPrimitiveValueImpl *left ){    if( left ) left->ref();    if ( m_left ) m_left->deref();    m_left = left;}// -----------------------------------------------------------------CSSImageValueImpl::CSSImageValueImpl(const DOMString &url, const StyleBaseImpl* style)    : CSSPrimitiveValueImpl(url, CSSPrimitiveValue::CSS_URI){    khtml::DocLoader *docLoader = 0;    const StyleBaseImpl *root = style;    while (root->parent())	root = root->parent();    if (root->isCSSStyleSheet())	docLoader = static_cast<const CSSStyleSheetImpl*>(root)->docLoader();    m_image = docLoader->requestImage(url);    if(m_image) m_image->ref(this);}CSSImageValueImpl::CSSImageValueImpl()    : CSSPrimitiveValueImpl(CSS_VAL_NONE){    m_image = 0;}CSSImageValueImpl::~CSSImageValueImpl(){    if(m_image) m_image->deref(this);}// ------------------------------------------------------------------------FontFamilyValueImpl::FontFamilyValueImpl( const QString &string): CSSPrimitiveValueImpl( DOMString(string), CSSPrimitiveValue::CSS_STRING){    static const QRegExp parenReg(" \\(.*\\)$");    static const QRegExp braceReg(" \\[.*\\]$");    parsedFontName = string;    // a language tag is often added in braces at the end. Remove it.    parsedFontName.replace(parenReg, QString::null);    // remove [Xft] qualifiers    parsedFontName.replace(braceReg, QString::null);#ifndef APPLE_CHANGES    const QString &available = KHTMLSettings::availableFamilies();    parsedFontName = parsedFontName.lower();    // kdDebug(0) << "searching for face '" << parsedFontName << "'" << endl;    int pos = available.find( ',' + parsedFontName + ',', 0, false );    if ( pos == -1 ) {        // many pages add extra MSs to make sure it's windows only ;(        if ( parsedFontName.startsWith( "ms " ) )            parsedFontName = parsedFontName.mid( 3 );        if ( parsedFontName.endsWith( " ms" ) )            parsedFontName.truncate( parsedFontName.length() - 3 );        pos = available.find( ",ms " + parsedFontName + ',', 0, false );        if ( pos == -1 )            pos = available.find( ',' + parsedFontName + " ms,", 0, false );    }    if ( pos != -1 ) {       ++pos;       int p = available.find(',', pos);       assert( p != -1 ); // available is supposed to start and end with ,       parsedFontName = available.mid( pos, p - pos);       // kdDebug(0) << "going for '" << parsedFontName << "'" << endl;    } else        parsedFontName = QString::null;#endif // !APPLE_CHANGES}FontValueImpl::FontValueImpl()    : style(0), variant(0), weight(0), size(0), lineHeight(0), family(0){}FontValueImpl::~FontValueImpl(){    delete style;    delete variant;    delete weight;    delete size;    delete lineHeight;    delete family;}DOMString FontValueImpl::cssText() const{    // font variant weight size / line-height family    DOMString result("");    if (style) {	result += style->cssText();    }    if (variant) {	if (result.length() > 0) {	    result += " ";	}	result += variant->cssText();    }    if (weight) {	if (result.length() > 0) {	    result += " ";	}	result += weight->cssText();    }    if (size) {	if (result.length() > 0) {	    result += " ";	}	result += size->cssText();    }    if (lineHeight) {	if (!size) {	    result += " ";	}	result += "/";	result += lineHeight->cssText();    }    if (family) {	if (result.length() > 0) {	    result += " ";	}	result += family->cssText();    }    return result;}QuotesValueImpl::QuotesValueImpl()    : levels(0){}DOMString QuotesValueImpl::cssText() const{    return "\"" + data.join("\" \"") + "\"";}void QuotesValueImpl::addLevel(const QString& open, const QString& close){    data.append(open);    data.append(close);    levels++;}QString QuotesValueImpl::openQuote(int level) const{    if (levels == 0) return "";    level--; // increments are calculated before openQuote is called//     kdDebug( 6080 ) << "Open quote level:" << level << endl;    if (level < 0) level = 0;    else    if (level >= (int) levels) level = (int) (levels-1);    return data[level*2];}QString QuotesValueImpl::closeQuote(int level) const{    if (levels == 0) return "";//     kdDebug( 6080 ) << "Close quote level:" << level << endl;    if (level < 0) level = 0;    else    if (level >= (int) levels) level = (int) (levels-1);    return data[level*2+1];}// Used for text-shadow and box-shadowShadowValueImpl::ShadowValueImpl(CSSPrimitiveValueImpl* _x, CSSPrimitiveValueImpl* _y,                                 CSSPrimitiveValueImpl* _blur, CSSPrimitiveValueImpl* _color)    :x(_x), y(_y), blur(_blur), color(_color){}ShadowValueImpl::~ShadowValueImpl(){    delete x;    delete y;    delete blur;    delete color;}DOMString ShadowValueImpl::cssText() const{    DOMString text("");    if (color) {        text += color->cssText();    }    if (x) {        if (text.length() > 0) {            text += " ";        }        text += x->cssText();    }    if (y) {        if (text.length() > 0) {            text += " ";        }        text += y->cssText();    }    if (blur) {        if (text.length() > 0) {            text += " ";        }        text += blur->cssText();    }    return text;}DOMString CounterActImpl::cssText() const{    DOMString text(m_counter);    text += DOMString(QString::number(m_value));    return text;}DOMString CSSProperty::cssText() const{    return getPropertyName(m_id) + DOMString(": ") + m_value->cssText() + (m_bImportant ? DOMString(" !important") : DOMString()) + DOMString("; ");}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?