void PHISHtmlGeneric::richTextLayouted() const
{
    _out+=_indent+"<div class=\"phi_"+QByteArray::number( PHI::RICH_TEXT )+"\""
        +id()+title()+startStyle()+colorStyle()+outlineColorStyle()+fontStyle()
        +alignmentStyle()+effectStyle()+"\">\n";
    _out+=_it->valueData()+'\n';
    _out+=_indent+"</div>\n";
}
void PHISHtmlGeneric::richText() const
{
    //return createGraphicsImage( GTRichText );
    _out+=_indent+"<div class=\"phi_"+QByteArray::number( PHI::TEXT )+"\""
       +id()+title()+startStyle()+colorStyle()+outlineColorStyle()+fontStyle()
       +alignmentStyle()+effectStyle()+"\">\n";
    _out+=_it->valueData()+'\n';
    _out+=_indent+"</div>\n";
}
void PHISHtmlGeneric::label() const
{
    _out+=_indent+"<div "+id()+startStyle()+effectStyle()+"\">\n";
    _out+=_indent+"\t<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" "
        +"id=\""+_it->id()+"_phitbl\"><tr><td style=\""+alignmentStyle()
        +colorStyle()+outlineColorStyle()+fontStyle()+heightStyle();
    _out+="overflow:visible;white-space:nowrap;\" onmouseover=\"this.style.cursor='default';\">";
        //" onmouseout=\"this.style.cursor='auto';\">";
    _out+=_it->valueData();
    _out+="</td></tr></table>\n"+_indent+"</div>\n";
}
void PHISHtmlWebKit532::button() const
{
    static QByteArray type=QByteArray::fromRawData( "-webkit-appearance:button;", 26 );
    _out+=_indent+"<input type=\"button\" class=\"phibuttontext\""+name()
        +title()+disabled()+value()+accessKey()+tabIndex()+onClickUrl()
        +startStyle( adjustButtonSize() )+colorStyle();
    if ( _isMacOSX ) {
        if ( _it->height()>35. ) _out+=type;
        QByteArray font=fontStyle();
        if ( font.isNull() ) {
            QFont f=_p->font();
            font.reserve( 200 );
            font+="font-family:'"+f.family().toUtf8();
            if ( !f.lastResortFamily().isEmpty() ) font+="','"+f.lastResortFamily().toUtf8();
            font+="';";
            if ( f.pointSize() > -1 ) font+="font-size:"+QByteArray::number( f.pointSize()+1 )+"pt;";
        }
        _out+=font;
    } else _out+=fontStyle();
    _out+=effectStyle()+_endtag;
}
void PHISHtmlWebKit532::imageButton() const
{
    _out+=_indent+"<button type=\"button\" class=\"phibuttontext\""
        +name()+disabled()+title()+accessKey()+tabIndex()
        +onClickUrl()+startStyle( adjustButtonSize() )+effectStyle();
    _out+="padding:0px;-webkit-appearance:button;\">\n";
    QByteArray url;
    if ( _it->imageId().startsWith( QLatin1String( "phi" ) ) )
        url="/phi.phis?phiimg="+_it->imageIdData()+"&amp;phitmp=1";
    else url="/phi.phis?phiimg="+_it->imageIdData();
    QByteArray style=" style=\"position:relative;vertical-align:middle;";
    _out+='\t';
    imageSource( url, style, _it->id()+"_phiimg", _it->toolTipData() );
    _out+=_indent+"\t<span style=\""+colorStyle()+fontStyle()
        +"\">"+_it->valueData()+"</span>\n";
    _out+=_indent+"</button>\n";
}
void PHISHtmlWebKit532::selectBox() const
{
    QByteArray font=fontStyle();
    if ( font.isNull() && _isMacOSX ) {
        QFont f=_p->font();
        font.reserve( 200 );
        font+="font-family:'"+f.family().toUtf8();
        if ( !f.lastResortFamily().isEmpty() ) font+="','"+f.lastResortFamily().toUtf8();
        font+="';";
        if ( f.pointSize() > -1 ) font+="font-size:"+QByteArray::number( f.pointSize()+1 )+"pt;";
    }
    _out+=_indent+"<select class=\"phitext\"";
    _out+=name()+title()+disabled()+accessKey()+tabIndex()
        +startStyle( adjustSelectSize() )+effectStyle()
        +font+colorStyle()+"\">\n";
    _out+=selectOptions();
    _out+=_indent+"</select>\n";
}
    void serializeBaseStyle()
    {
        PagePopupClient::addString("baseStyle: {", m_buffer);
        addProperty("backgroundColor", m_backgroundColor.serialized(), m_buffer);
        addProperty("color", m_foregroundColor.serialized(), m_buffer);
        addProperty("textTransform", String(textTransformToString(m_textTransform)), m_buffer);
        addProperty("fontSize", fontSize(), m_buffer);
        addProperty("fontStyle", String(fontStyleToString(fontStyle())), m_buffer);
        addProperty("fontVariant", String(fontVariantToString(fontVariant())), m_buffer);

        PagePopupClient::addString("fontFamily: [", m_buffer);
        for (const FontFamily* f = &fontFamily(); f; f = f->next()) {
            addJavaScriptString(f->family().string(), m_buffer);
            if (f->next())
                PagePopupClient::addString(",", m_buffer);
        }
        PagePopupClient::addString("]", m_buffer);
        PagePopupClient::addString("},\n", m_buffer);
    }
void PHISHtmlGeneric::menuLink() const
{
    _out+=_indent+"<div "+id()+title()+onClickUrl()+startStyle()+effectStyle()+"\">\n";
    _out+=_indent+"\t<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" "
        +"id=\""+_it->id()+"_phitbl\"><tr><td style=\""+alignmentStyle()
        +colorStyle()+outlineColorStyle()+fontStyle()+heightStyle()
        +"overflow:visible;white-space:nowrap;\"";
    if ( _it->rolloverTextColor().isValid() || _it->rolloverBackgroundColor().isValid() ) {
        _out+=" onmouseover=\"this.style.cursor='default';";
        if ( _it->rolloverTextColor().isValid() )
            _out+="this.style.color='"+_it->rolloverTextColor().name().toLatin1()+"';";
        if ( _it->rolloverBackgroundColor().isValid() )
            _out+="this.style.backgroundColor='"+_it->rolloverBackgroundColor().name().toLatin1()+"';";
        _out+='"';
        QColor tc=_it->color().isValid() ? _it->color() : _p->palette().color( QPalette::WindowText );
        _out+=" onmouseout=\"this.style.color='"+tc.name().toLatin1()+"';";
        if ( _it->outlineColor().isValid() )
            _out+="this.style.backgroundColor='"+_it->outlineColor().name().toLatin1()+"';";
        _out+='"';
    }
    _out+='>'+_it->valueData();
    _out+="</td></tr></table>\n"+_indent+"</div>\n";
}
Example #9
0
QVector<OsmAnd::TextRasterizer_P::LinePaint> OsmAnd::TextRasterizer_P::evaluatePaints(
    const QVector<QStringRef>& lineRefs,
    const Style& style) const
{
    // Prepare default paint
    SkPaint paint = _defaultPaint;
    paint.setTextSize(style.size);
    paint.setColor(style.color.toSkColor());

    // Transform text style to font style
    const SkFontStyle fontStyle(
        style.bold ? SkFontStyle::kBold_Weight : SkFontStyle::kNormal_Weight,
        SkFontStyle::kNormal_Width,
        style.italic ? SkFontStyle::kItalic_Slant : SkFontStyle::kUpright_Slant);

    const auto pText = lineRefs.first().string()->constData();

    QVector<LinePaint> linePaints;
    linePaints.reserve(lineRefs.count());
    for (const auto& lineRef : constOf(lineRefs))
    {
        LinePaint linePaint;
        linePaint.line = lineRef;

        TextPaint* pTextPaint = nullptr;
        const auto pLine = lineRef.constData();
        const auto pEnd = pLine + lineRef.size();
        auto pNextCharacter = pLine;
        while (pNextCharacter != pEnd)
        {
            const auto pCharacter = pNextCharacter;
            const auto position = pNextCharacter - pText;
            const auto characterUCS4 = SkUTF16_NextUnichar(reinterpret_cast<const uint16_t**>(&pNextCharacter));

            // First of all check previous font if it contains this character
            auto font = pTextPaint ? pTextPaint->paint.getTypeface() : nullptr;
            if (font)
            {
                SkPaint paint;
                paint.setTextEncoding(SkPaint::kUTF32_TextEncoding);
                paint.setTypeface(font);
                if (!paint.containsText(&characterUCS4, sizeof(uint32_t)))
                    font = nullptr;
#if OSMAND_LOG_CHARACTERS_FONT
                else
                {
                    SkString fontName;
                    font->getFamilyName(&fontName);

                    LogPrintf(LogSeverityLevel::Warning,
                              "UCS4 character 0x%08x (%u) has been found in '%s' font (reused)",
                              characterUCS4,
                              characterUCS4,
                              fontName.c_str());
                }
#endif // OSMAND_LOG_CHARACTERS_FONT
            }
            if (!font)
            {
                font = owner->fontFinder->findFontForCharacterUCS4(characterUCS4, fontStyle);

#if OSMAND_LOG_CHARACTERS_WITHOUT_FONT
                if (!font)
                {
                    LogPrintf(LogSeverityLevel::Warning,
                              "UCS4 character 0x%08x (%u) has not been found in any font",
                              characterUCS4,
                              characterUCS4);
                }
#endif // OSMAND_LOG_CHARACTERS_WITHOUT_FONT

#if OSMAND_LOG_CHARACTERS_FONT
                if (font)
                {
                    SkString fontName;
                    font->getFamilyName(&fontName);

                    LogPrintf(LogSeverityLevel::Warning,
                              "UCS4 character 0x%08x (%u) has been found in '%s' font",
                              characterUCS4,
                              characterUCS4,
                              fontName.c_str());
                }
#endif // OSMAND_LOG_CHARACTERS_FONT
            }

            if (pTextPaint == nullptr || pTextPaint->paint.getTypeface() != font)
            {
                linePaint.textPaints.push_back(qMove(TextPaint()));
                pTextPaint = &linePaint.textPaints.last();

                pTextPaint->text = QStringRef(lineRef.string(), position, 1);
                pTextPaint->paint = paint;
                pTextPaint->paint.setTypeface(font);

                SkPaint::FontMetrics metrics;
                pTextPaint->height = paint.getFontMetrics(&metrics);
                linePaint.maxFontHeight = qMax(linePaint.maxFontHeight, pTextPaint->height);
                linePaint.minFontHeight = qMin(linePaint.minFontHeight, pTextPaint->height);
                linePaint.maxFontLineSpacing = qMax(linePaint.maxFontLineSpacing, metrics.fLeading);
                linePaint.minFontLineSpacing = qMin(linePaint.minFontLineSpacing, metrics.fLeading);
                linePaint.maxFontTop = qMax(linePaint.maxFontTop, -metrics.fTop);
                linePaint.minFontTop = qMin(linePaint.minFontTop, -metrics.fTop);
                linePaint.maxFontBottom = qMax(linePaint.maxFontBottom, metrics.fBottom);
                linePaint.minFontBottom = qMin(linePaint.minFontBottom, metrics.fBottom);

                if (style.bold && (!font || (font && font->fontStyle().weight() <= SkFontStyle::kNormal_Weight)))
                    pTextPaint->paint.setFakeBoldText(true);
            }
            else
            {
                pTextPaint->text = QStringRef(lineRef.string(), pTextPaint->text.position(), pTextPaint->text.size() + 1);
            }
        }

        linePaints.push_back(qMove(linePaint));
    }

    return linePaints;
}