int Font::getStyleFlags() const noexcept { int styleFlags = font->underline ? underlined : plain; if (isBold()) styleFlags |= bold; if (isItalic()) styleFlags |= italic; return styleFlags; }
// render void CWindowControl_Radio::render(void) { float32 fRadius = getSize().m_x / 2; CVector2ui32 vecCircleCenterPosition = getPosition() + ((uint32) fRadius); // todo - use CVector2ui32 vecCircleCenterPosition = CMathUtility::getCircleFromRectangle() if (isChecked()) { CGDIPlusUtility::drawCircleFill(vecCircleCenterPosition, fRadius, 0x0000FFFF); } else { CGDIPlusUtility::drawCircleFill(vecCircleCenterPosition, fRadius, getFillColour()); } CGDIPlusUtility::drawCircleBorder(vecCircleCenterPosition, fRadius, getLineColour()); CGDIPlusUtility::drawText(CVector2ui32(getPosition().m_x + getSize().m_x + getIconRightMargin(), getPosition().m_y), CVector2ui32(getPosition().m_x + getSize().m_x + getIconRightMargin() + 500, getSize().m_y), getText(), getTextColour(), getFontSize(), isBold()); }
bool Font::format(QDomDocument &doc, QDomElement &f, uint pos, uint len, bool all) const { f.setAttribute("id", 1); if (!all) f.setAttribute("pos", pos); if (!all) f.setAttribute("len", len); QDomElement element; Font def; if ( all || _data->family!=def._data->family ) { element = doc.createElement("FONT"); element.setAttribute("name", _data->family); f.appendChild(element); } if ( all || _pointSize!=def._pointSize ) { element = doc.createElement("SIZE"); element.setAttribute("value", _pointSize); f.appendChild(element); } if ( all || isItalic(_data->style)!=isItalic(def._data->style) ) { element = doc.createElement("ITALIC"); element.setAttribute("value", (isItalic(_data->style) ? 1 : 0)); f.appendChild(element); } if ( all || isBold(_data->style)!=isBold(def._data->style) ) { element = doc.createElement("WEIGHT"); element.setAttribute("value", (isBold(_data->style) ? QFont::Bold : QFont::Normal)); f.appendChild(element); } // if ( all || _underline!=def._underline ) { // element = doc.createElement("UNDERLINE"); // element.setAttribute("value", (_underline ? 1 : 0)); // f.appendChild(element); // } // if ( all || _strikeOut!=def._strikeOut ) { // element = doc.createElement("STRIKEOUT"); // element.setAttribute("value", (_strikeOut ? 1 : 0)); // f.appendChild(element); // } if (all) { element = doc.createElement("VERTALIGN"); element.setAttribute("value", 0); f.appendChild(element); } if ( all || _color!=def._color ) { element = doc.createElement("COLOR"); element.setAttribute("red", _color.red()); element.setAttribute("green", _color.green()); element.setAttribute("blue", _color.blue()); f.appendChild(element); } if (all) { // #### FIXME element = doc.createElement("TEXTBACKGROUNDCOLOR"); element.setAttribute("red", 255); element.setAttribute("green",255); element.setAttribute("blue", 255); f.appendChild(element); } return f.hasChildNodes(); }
void Font::init(const QString &n) { // check if font already parsed _data = _dict->find(n); if ( _data==0 ) { // kdDebug(30516) << "font " << n << endl; QString name = n; name.replace("oblique", "italic"); // check if known font _data = new Data; uint i = 0; while ( KNOWN_DATA[i].name!=0 ) { if ( name.find(KNOWN_DATA[i].name)!=-1 ) { // kdDebug(30516) << "found " << KNOWN_DATA[i].name // << " " << isBold(KNOWN_DATA[i].style) << endl; _data->family = FAMILY_DATA[KNOWN_DATA[i].family]; _data->style = KNOWN_DATA[i].style; _data->latex = KNOWN_DATA[i].latex; break; } i++; } if ( _data->family.isEmpty() ) { // let's try harder // simple heuristic kdDebug(30516) << "unknown font : " << n << endl; if ( name.find("times")!=-1 ) _data->family = FAMILY_DATA[Times]; else if ( name.find("helvetica")!=-1 ) _data->family = FAMILY_DATA[Helvetica]; else if ( name.find("courier")!=-1 ) _data->family = FAMILY_DATA[Courier]; else if ( name.find("symbol")!=-1 ) _data->family = FAMILY_DATA[Symbol]; else { // with Qt QFontDatabase fdb; QStringList list = fdb.families(); list = list.grep(name, false); if ( !list.isEmpty() ) { _data->family = list[0]; kdDebug(30516) << "in Qt database as " << list[0] << endl; } else { kdDebug(30516) << "really unknown font !" << endl; _data->family = name; } } bool italic = ( name.find("italic")!=-1 ); bool bold = ( name.find("bold")!=-1 ); _data->style = toStyle(bold, italic); _data->latex = false; } _dict->insert(name, _data); } // check if QFont already created if ( !_data->height.contains(_pointSize) ) { QFont font(_data->family, _pointSize, (isBold(_data->style) ? QFont::Bold : QFont::Normal), isItalic(_data->style)); QFontMetrics fm(font); _data->height.insert(_pointSize, fm.height()); } }
/** Render text and clip it to the specified rectangle if wanted, it will also * do checking for missing characters in font and lazy load them. * \param text The text to be rendering. * \param position The position to be rendering. * \param color The color used when rendering. * \param hcenter If rendered horizontally center. * \param vcenter If rendered vertically center. * \param clip If clipping is needed. * \param font_settings \ref FontSettings to use. * \param char_collector \ref FontCharCollector to render billboard text. */ void FontWithFace::render(const core::stringw& text, const core::rect<s32>& position, const video::SColor& color, bool hcenter, bool vcenter, const core::rect<s32>* clip, FontSettings* font_settings, FontCharCollector* char_collector) { #ifndef SERVER_ONLY const bool black_border = font_settings ? font_settings->useBlackBorder() : false; const bool rtl = font_settings ? font_settings->isRTL() : false; const float scale = font_settings ? font_settings->getScale() : 1.0f; const float shadow = font_settings ? font_settings->useShadow() : false; if (shadow) { assert(font_settings); // Avoid infinite recursion font_settings->setShadow(false); core::rect<s32> shadowpos = position; shadowpos.LowerRightCorner.X += 2; shadowpos.LowerRightCorner.Y += 2; render(text, shadowpos, font_settings->getShadowColor(), hcenter, vcenter, clip, font_settings); // Set back font_settings->setShadow(true); } core::position2d<float> offset(float(position.UpperLeftCorner.X), float(position.UpperLeftCorner.Y)); core::dimension2d<s32> text_dimension; if (rtl || hcenter || vcenter || clip) { text_dimension = getDimension(text.c_str(), font_settings); if (hcenter) offset.X += (position.getWidth() - text_dimension.Width) / 2; else if (rtl) offset.X += (position.getWidth() - text_dimension.Width); if (vcenter) offset.Y += (position.getHeight() - text_dimension.Height) / 2; if (clip) { core::rect<s32> clippedRect(core::position2d<s32> (s32(offset.X), s32(offset.Y)), text_dimension); clippedRect.clipAgainst(*clip); if (!clippedRect.isValid()) return; } } // Collect character locations const unsigned int text_size = text.size(); core::array<s32> indices(text_size); core::array<core::position2d<float>> offsets(text_size); std::vector<bool> fallback(text_size); // Test again if lazy load char is needed, // as some text isn't drawn with getDimension insertCharacters(text.c_str()); updateCharactersList(); for (u32 i = 0; i < text_size; i++) { wchar_t c = text[i]; if (c == L'\r' || // Windows breaks c == L'\n' ) // Unix breaks { if (c==L'\r' && text[i+1]==L'\n') c = text[++i]; offset.Y += m_font_max_height * scale; offset.X = float(position.UpperLeftCorner.X); if (hcenter) offset.X += (position.getWidth() - text_dimension.Width) >> 1; continue; } // if lineBreak bool use_fallback_font = false; const FontArea &area = getAreaFromCharacter(c, &use_fallback_font); fallback[i] = use_fallback_font; if (char_collector == NULL) { float glyph_offset_x = area.bearing_x * (fallback[i] ? m_fallback_font_scale : scale); float glyph_offset_y = area.offset_y * (fallback[i] ? m_fallback_font_scale : scale); offset.X += glyph_offset_x; offset.Y += glyph_offset_y; offsets.push_back(offset); offset.X -= glyph_offset_x; offset.Y -= glyph_offset_y; } else { // Billboard text specific, use offset_y_bt instead float glyph_offset_x = area.bearing_x * (fallback[i] ? m_fallback_font_scale : scale); float glyph_offset_y = area.offset_y_bt * (fallback[i] ? m_fallback_font_scale : scale); offset.X += glyph_offset_x; offset.Y += glyph_offset_y; offsets.push_back(offset); offset.X -= glyph_offset_x; offset.Y -= glyph_offset_y; } indices.push_back(area.spriteno); offset.X += getCharWidth(area, fallback[i], scale); } // for i < text_size // Do the actual rendering const int indice_amount = indices.size(); core::array<gui::SGUISprite>& sprites = m_spritebank->getSprites(); core::array<core::rect<s32>>& positions = m_spritebank->getPositions(); core::array<gui::SGUISprite>* fallback_sprites; core::array<core::rect<s32>>* fallback_positions; if (m_fallback_font != NULL) { fallback_sprites = &m_fallback_font->m_spritebank->getSprites(); fallback_positions = &m_fallback_font->m_spritebank->getPositions(); } else { fallback_sprites = NULL; fallback_positions = NULL; } const int sprite_amount = sprites.size(); if ((black_border || isBold()) && char_collector == NULL) { // Draw black border first, to make it behind the real character // which make script language display better video::SColor black(color.getAlpha(),0,0,0); for (int n = 0; n < indice_amount; n++) { const int sprite_id = indices[n]; if (!fallback[n] && (sprite_id < 0 || sprite_id >= sprite_amount)) continue; if (indices[n] == -1) continue; const int tex_id = (fallback[n] ? (*fallback_sprites)[sprite_id].Frames[0].textureNumber : sprites[sprite_id].Frames[0].textureNumber); core::rect<s32> source = (fallback[n] ? (*fallback_positions) [(*fallback_sprites)[sprite_id].Frames[0].rectNumber] : positions[sprites[sprite_id].Frames[0].rectNumber]); core::dimension2d<float> size(0.0f, 0.0f); float cur_scale = (fallback[n] ? m_fallback_font_scale : scale); size.Width = source.getSize().Width * cur_scale; size.Height = source.getSize().Height * cur_scale; core::rect<float> dest(offsets[n], size); video::ITexture* texture = (fallback[n] ? m_fallback_font->m_spritebank->getTexture(tex_id) : m_spritebank->getTexture(tex_id)); for (int x_delta = -2; x_delta <= 2; x_delta++) { for (int y_delta = -2; y_delta <= 2; y_delta++) { if (x_delta == 0 || y_delta == 0) continue; draw2DImage(texture, dest + core::position2d<float> (float(x_delta), float(y_delta)), source, clip, black, true); } } } } for (int n = 0; n < indice_amount; n++) { const int sprite_id = indices[n]; if (!fallback[n] && (sprite_id < 0 || sprite_id >= sprite_amount)) continue; if (indices[n] == -1) continue; const int tex_id = (fallback[n] ? (*fallback_sprites)[sprite_id].Frames[0].textureNumber : sprites[sprite_id].Frames[0].textureNumber); core::rect<s32> source = (fallback[n] ? (*fallback_positions)[(*fallback_sprites)[sprite_id].Frames[0] .rectNumber] : positions[sprites[sprite_id].Frames[0].rectNumber]); core::dimension2d<float> size(0.0f, 0.0f); float cur_scale = (fallback[n] ? m_fallback_font_scale : scale); size.Width = source.getSize().Width * cur_scale; size.Height = source.getSize().Height * cur_scale; core::rect<float> dest(offsets[n], size); video::ITexture* texture = (fallback[n] ? m_fallback_font->m_spritebank->getTexture(tex_id) : m_spritebank->getTexture(tex_id)); if (fallback[n] || isBold()) { video::SColor top = GUIEngine::getSkin()->getColor("font::top"); video::SColor bottom = GUIEngine::getSkin() ->getColor("font::bottom"); top.setAlpha(color.getAlpha()); bottom.setAlpha(color.getAlpha()); video::SColor title_colors[] = {top, bottom, top, bottom}; if (char_collector != NULL) { char_collector->collectChar(texture, dest, source, title_colors); } else { draw2DImage(texture, dest, source, clip, title_colors, true); } } else { if (char_collector != NULL) { video::SColor colors[] = {color, color, color, color}; char_collector->collectChar(texture, dest, source, colors); } else { draw2DImage(texture, dest, source, clip, color, true); } } } #endif } // render
void CWindowControl_Text::render(void) { CGDIPlusUtility::drawText(getPosition(), getSize(), getText(), getTextColour(), getFontSize(), isBold()); }
// render void CWindowControl_Check::render(void) { CGDIPlusUtility::drawRectangleFill(getPosition(), getSize(), getFillColour()); CGDIPlusUtility::drawRectangleBorder(getPosition(), getSize(), getLineColour()); if(isChecked()) { CGDIPlusUtility::drawLine(CVector2ui32(getPosition().m_x, getPosition().m_y + getSize().m_y), CVector2ui32(getPosition().m_x + getSize().m_x, getPosition().m_y), getLineColour()); } CGDIPlusUtility::drawText(CVector2ui32(getPosition().m_x + getSize().m_x + getIconRightMargin(), getPosition().m_y), getSize(), getText(), getTextColour(), getFontSize(), isBold()); }