bool FontFaceSet::resolveFontStyle(const String& fontString, Font& font) { if (fontString.isEmpty()) return false; // Interpret fontString in the same way as the 'font' attribute of CanvasRenderingContext2D. RefPtrWillBeRawPtr<MutableStylePropertySet> parsedStyle = MutableStylePropertySet::create(HTMLStandardMode); CSSParser::parseValue(parsedStyle.get(), CSSPropertyFont, fontString, true, 0); if (parsedStyle->isEmpty()) return false; String fontValue = parsedStyle->getPropertyValue(CSSPropertyFont); if (fontValue == "inherit" || fontValue == "initial") return false; RefPtr<ComputedStyle> style = ComputedStyle::create(); FontFamily fontFamily; fontFamily.setFamily(defaultFontFamily); FontDescription defaultFontDescription; defaultFontDescription.setFamily(fontFamily); defaultFontDescription.setSpecifiedSize(defaultFontSize); defaultFontDescription.setComputedSize(defaultFontSize); style->setFontDescription(defaultFontDescription); style->font().update(style->font().fontSelector()); document()->ensureStyleResolver().computeFont(style.get(), *parsedStyle); font = style->font(); font.update(document()->styleEngine().fontSelector()); return true; }
static Font makeFont(const WebFontDescription& description) { AtomicString::init(); String fontFamilyString(description.family, description.familyLength); FontDescription f; FontFamily family; family.setFamily(fontFamilyString); f.setFamily(family); f.setSpecifiedSize(description.size); f.setComputedSize(description.size); f.setItalic(description.italic); f.setWeight(description.bold ? FontWeightBold : FontWeightNormal); f.setIsAbsoluteSize(true); FontSmoothingType smoothingType; if (SUCCEEDED(WebPreferences::sharedStandardPreferences()->fontSmoothing(&smoothingType))) f.setRenderingMode(smoothingType == FontSmoothingTypeWindows ? AlternateRenderingMode : NormalRenderingMode); Font font(f, 0, 0); font.update(0); return font; }
static void gtk_cairo_draw_text(GraphicsContext *gc, const String& text, unsigned int length, int fontSize, int line) { // Need to create an empty document so that a CSSSelector can be created PassRefPtr<Document> document(Document::create(0)); // Create the Font selector using this document PassRefPtr<CSSFontSelector> fontSelector = CSSFontSelector::create(document.get()); // Use Arial as font family FontFamily family; family.setFamily("arial"); // Create a font description to then assign to the font object FontDescription fontDescription = FontDescription(); fontDescription.setFamily(family); fontDescription.setComputedSize(fontSize); fontDescription.setSpecifiedSize(fontSize); fontDescription.setWeight(FontWeightNormal); fontDescription.setGenericFamily(FontDescription::SansSerifFamily); fontDescription.setKeywordSize(4); // Create the font and initialize it static Font font(fontDescription, 0, 0); font.update(fontSelector); const UChar* string = text.characters(); // When rtl has to be added, configure in TextRun constructor // TextRun textRun(string, length, 0, 0, 0, rtl, override, false, false); TextRun textRun(string, length); font.drawText(gc, textRun, FloatPoint(0, line*fontSize), 0, -1); // c->drawBidiText(font, textRun, location); }
void RenderThemeQStyle::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element*) const { // Ditch the border. style->resetBorder(); #ifdef Q_WS_MAC if (style->appearance() == PushButtonPart) { // The Mac ports ignore the specified height for <input type="button"> elements // unless a border and/or background CSS property is also specified. style->setHeight(Length(Auto)); } #endif FontDescription fontDescription = style->fontDescription(); fontDescription.setIsAbsoluteSize(true); #ifdef Q_WS_MAC // Use fixed font size and family on Mac (like Safari does) fontDescription.setSpecifiedSize(m_buttonFontPixelSize); fontDescription.setComputedSize(m_buttonFontPixelSize); #else fontDescription.setSpecifiedSize(style->fontSize()); fontDescription.setComputedSize(style->fontSize()); #endif FontFamily fontFamily; fontFamily.setFamily(m_buttonFontFamily); fontDescription.setFamily(fontFamily); style->setFontDescription(fontDescription); style->font().update(selector->fontSelector()); style->setLineHeight(RenderStyle::initialLineHeight()); setButtonSize(style); setButtonPadding(style); }
void RenderThemeQt::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const { // Ditch the border. style->resetBorder(); // Height is locked to auto. style->setHeight(Length(Auto)); // White-space is locked to pre style->setWhiteSpace(PRE); // Use fixed font size and family FontDescription fontDescription = style->fontDescription(); fontDescription.setIsAbsoluteSize(true); fontDescription.setSpecifiedSize(m_buttonFontPixelSize); fontDescription.setComputedSize(m_buttonFontPixelSize); FontFamily fontFamily; fontFamily.setFamily(m_buttonFontFamily); fontDescription.setFamily(fontFamily); style->setFontDescription(fontDescription); style->setLineHeight(RenderStyle::initialLineHeight()); setButtonSize(style); setButtonPadding(style); }
void RenderThemeQt::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const { // Ditch the border. style->resetBorder(); // Height is locked to auto. style->setHeight(Length(Auto)); // White-space is locked to pre style->setWhiteSpace(PRE); FontDescription fontDescription = style->fontDescription(); fontDescription.setIsAbsoluteSize(true); #ifdef Q_WS_MAC // Use fixed font size and family on Mac (like Safari does) fontDescription.setSpecifiedSize(m_buttonFontPixelSize); fontDescription.setComputedSize(m_buttonFontPixelSize); #else fontDescription.setSpecifiedSize(style->fontSize()); fontDescription.setComputedSize(style->fontSize()); #endif FontFamily fontFamily; fontFamily.setFamily(m_buttonFontFamily); fontDescription.setFamily(fontFamily); style->setFontDescription(fontDescription); style->setLineHeight(RenderStyle::initialLineHeight()); setButtonSize(style); setButtonPadding(style); style->setColor(QApplication::palette().text().color()); }
void CSSFontFace::load() { FontDescription fontDescription; FontFamily fontFamily; fontFamily.setFamily(m_fontFace->family()); fontDescription.setFamily(fontFamily); fontDescription.setTraits(m_fontFace->traits()); load(fontDescription); }
static Font dragLabelFont(int size, bool bold) { FontDescription desc; desc.setWeight(bold ? FontWeightBold : FontWeightNormal); FontFamily family; family.setFamily("Lucida Grande"); desc.setFamily(family); desc.setSpecifiedSize((float)size); desc.setComputedSize((float)size); Font result = Font(desc, 0, 0); result.update(0); return result; }
CanvasFontCache::CanvasFontCache(Document& document) : m_document(&document), m_pruningScheduled(false) { FontFamily fontFamily; fontFamily.setFamily(defaultFontFamily); FontDescription defaultFontDescription; defaultFontDescription.setFamily(fontFamily); defaultFontDescription.setSpecifiedSize(defaultFontSize); defaultFontDescription.setComputedSize(defaultFontSize); m_defaultFontStyle = ComputedStyle::create(); m_defaultFontStyle->setFontDescription(defaultFontDescription); m_defaultFontStyle->font().update( m_defaultFontStyle->font().getFontSelector()); }
Font createTestFont(const AtomicString& familyName, const String& fontPath, float size) { FontFamily family; family.setFamily(familyName); FontDescription fontDescription; fontDescription.setFamily(family); fontDescription.setSpecifiedSize(size); fontDescription.setComputedSize(size); Font font(fontDescription); font.update(TestFontSelector::create(fontPath)); return font; }
void FontFace::load(ExecutionContext* context) { if (m_status != Unloaded) return; FontDescription fontDescription; FontFamily fontFamily; fontFamily.setFamily(m_family); fontDescription.setFamily(fontFamily); fontDescription.setTraits(traits()); CSSFontSelector* fontSelector = toDocument(context)->styleEngine()->fontSelector(); m_cssFontFace->load(fontDescription, fontSelector); fontSelector->loadPendingFonts(); }
bool FontFaceSet::resolveFontStyle(const String& fontString, Font& font) { if (fontString.isEmpty()) return false; // Interpret fontString in the same way as the 'font' attribute of CanvasRenderingContext2D. RefPtr<MutableStylePropertySet> parsedStyle = MutableStylePropertySet::create(); BisonCSSParser::parseValue(parsedStyle.get(), CSSPropertyFont, fontString, HTMLStandardMode, 0); if (parsedStyle->isEmpty()) return false; String fontValue = parsedStyle->getPropertyValue(CSSPropertyFont); if (fontValue == "inherit" || fontValue == "initial") return false; RefPtr<RenderStyle> style = RenderStyle::create(); FontFamily fontFamily; fontFamily.setFamily(defaultFontFamily); FontDescription defaultFontDescription; defaultFontDescription.setFamily(fontFamily); defaultFontDescription.setSpecifiedSize(defaultFontSize); defaultFontDescription.setComputedSize(defaultFontSize); style->setFontDescription(defaultFontDescription); style->font().update(style->font().fontSelector()); // Now map the font property longhands into the style. CSSPropertyValue properties[] = { CSSPropertyValue(CSSPropertyFontFamily, *parsedStyle), CSSPropertyValue(CSSPropertyFontStretch, *parsedStyle), CSSPropertyValue(CSSPropertyFontStyle, *parsedStyle), CSSPropertyValue(CSSPropertyFontVariant, *parsedStyle), CSSPropertyValue(CSSPropertyFontWeight, *parsedStyle), CSSPropertyValue(CSSPropertyFontSize, *parsedStyle), CSSPropertyValue(CSSPropertyLineHeight, *parsedStyle), }; StyleResolver& styleResolver = document()->styleResolver(); styleResolver.applyPropertiesToStyle(properties, WTF_ARRAY_LENGTH(properties), style.get()); font = style->font(); font.update(document()->styleEngine()->fontSelector()); return true; }
static Font dragLabelFont(int size, bool bold, FontRenderingMode renderingMode) { NONCLIENTMETRICS metrics; metrics.cbSize = sizeof(metrics); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0); FontDescription desc; desc.setWeight(bold ? FontWeightBold : FontWeightNormal); FontFamily family; family.setFamily(metrics.lfSmCaptionFont.lfFaceName); desc.setFamily(family); desc.setSpecifiedSize((float)size); desc.setComputedSize((float)size); desc.setRenderingMode(renderingMode); Font result = Font(desc, 0, 0); result.update(0); return result; }
WebFontDescription::operator FontDescription() const { FontFamily fontFamily; fontFamily.setFamily(family); FontDescription desc; desc.setFamily(fontFamily); desc.setGenericFamily(static_cast<FontDescription::GenericFamilyType>(genericFamily)); desc.setSpecifiedSize(size); desc.setComputedSize(size); desc.setStyle(italic ? FontStyleItalic : FontStyleNormal); desc.setVariant(smallCaps ? FontVariantSmallCaps : FontVariantNormal); desc.setWeight(static_cast<FontWeight>(weight)); desc.setFontSmoothing(static_cast<FontSmoothingMode>(smoothing)); desc.setLetterSpacing(letterSpacing); desc.setWordSpacing(wordSpacing); return desc; }
FontFamily FontBuilder::standardFontFamily() const { FontFamily family; family.setFamily(standardFontFamilyName()); return family; }
void PlatformCALayerWinInternal::displayCallback(CACFLayerRef caLayer, CGContextRef context) { ASSERT(isMainThread()); if (!owner() || !owner()->owner()) return; CGContextSaveGState(context); CGRect layerBounds = owner()->bounds(); if (owner()->owner()->platformCALayerContentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesTopDown) { CGContextScaleCTM(context, 1, -1); CGContextTranslateCTM(context, 0, -layerBounds.size.height); } if (owner()->owner()) { GraphicsContext graphicsContext(context); // It's important to get the clip from the context, because it may be significantly // smaller than the layer bounds (e.g. tiled layers) CGRect clipBounds = CGContextGetClipBoundingBox(context); IntRect clip(enclosingIntRect(clipBounds)); owner()->owner()->platformCALayerPaintContents(graphicsContext, clip); } #ifndef NDEBUG else { ASSERT_NOT_REACHED(); // FIXME: ideally we'd avoid calling -setNeedsDisplay on a layer that is a plain color, // so CA never makes backing store for it (which is what -setNeedsDisplay will do above). CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 1.0f); CGContextFillRect(context, layerBounds); } #endif if (owner()->owner()->platformCALayerShowRepaintCounter(owner())) { FontCachePurgePreventer fontCachePurgePreventer; String text = String::number(owner()->owner()->platformCALayerIncrementRepaintCount()); CGContextSaveGState(context); // Make the background of the counter the same as the border color, // unless there is no border, then make it red float borderWidth = CACFLayerGetBorderWidth(caLayer); if (borderWidth > 0) { CGColorRef borderColor = CACFLayerGetBorderColor(caLayer); const CGFloat* colors = CGColorGetComponents(borderColor); CGContextSetRGBFillColor(context, colors[0], colors[1], colors[2], colors[3]); } else CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 0.8f); CGRect aBounds = layerBounds; aBounds.size.width = 10 + 10 * text.length(); aBounds.size.height = 22; CGContextFillRect(context, aBounds); FontDescription desc; NONCLIENTMETRICS metrics; metrics.cbSize = sizeof(metrics); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0); FontFamily family; family.setFamily(metrics.lfSmCaptionFont.lfFaceName); desc.setFamily(family); desc.setComputedSize(18); Font font = Font(desc, 0, 0); font.update(0); GraphicsContext cg(context); cg.setFillColor(Color::black, ColorSpaceDeviceRGB); cg.drawText(font, TextRun(text), IntPoint(aBounds.origin.x + 5, aBounds.origin.y + 17)); CGContextRestoreGState(context); } CGContextRestoreGState(context); owner()->owner()->platformCALayerLayerDidDisplay(caLayer); }
virtual void drawInContext(PlatformGraphicsContext* context) { if (!m_owner) return; CGContextSaveGState(context); CGRect layerBounds = bounds(); if (m_owner->contentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesTopDown) { CGContextScaleCTM(context, 1, -1); CGContextTranslateCTM(context, 0, -layerBounds.size.height); } if (m_owner->client()) { GraphicsContext graphicsContext(context); // It's important to get the clip from the context, because it may be significantly // smaller than the layer bounds (e.g. tiled layers) CGRect clipBounds = CGContextGetClipBoundingBox(context); IntRect clip(enclosingIntRect(clipBounds)); m_owner->paintGraphicsLayerContents(graphicsContext, clip); } #ifndef NDEBUG else { ASSERT_NOT_REACHED(); // FIXME: ideally we'd avoid calling -setNeedsDisplay on a layer that is a plain color, // so CA never makes backing store for it (which is what -setNeedsDisplay will do above). CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 1.0f); CGContextFillRect(context, layerBounds); } #endif if (m_owner->showRepaintCounter()) { String text = String::format("%d", m_owner->incrementRepaintCount());; CGContextSaveGState(context); CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 0.8f); CGRect aBounds = layerBounds; aBounds.size.width = 10 + 12 * text.length(); aBounds.size.height = 25; CGContextFillRect(context, aBounds); FontDescription desc; NONCLIENTMETRICS metrics; metrics.cbSize = sizeof(metrics); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0); FontFamily family; family.setFamily(metrics.lfSmCaptionFont.lfFaceName); desc.setFamily(family); desc.setComputedSize(22); Font font = Font(desc, 0, 0); font.update(0); GraphicsContext cg(context); cg.setFillColor(Color::black, DeviceColorSpace); cg.drawText(font, TextRun(text), IntPoint(aBounds.origin.x + 3, aBounds.origin.y + 20)); CGContextRestoreGState(context); } CGContextRestoreGState(context); }
void FullscreenVideoController::draw() { OwnPtr<HDC> bitmapDC = adoptPtr(CreateCompatibleDC(HWndDC(m_hudWindow))); HGDIOBJ oldBitmap = SelectObject(bitmapDC.get(), m_bitmap.get()); GraphicsContext context(bitmapDC.get(), true); context.save(); // Draw the background IntSize outerRadius(borderRadius, borderRadius); IntRect outerRect(0, 0, windowWidth, windowHeight); IntSize innerRadius(borderRadius - borderThickness, borderRadius - borderThickness); IntRect innerRect(borderThickness, borderThickness, windowWidth - borderThickness * 2, windowHeight - borderThickness * 2); context.fillRoundedRect(outerRect, outerRadius, outerRadius, outerRadius, outerRadius, Color(borderColor), ColorSpaceDeviceRGB); context.setCompositeOperation(CompositeCopy); context.fillRoundedRect(innerRect, innerRadius, innerRadius, innerRadius, innerRadius, Color(backgroundColor), ColorSpaceDeviceRGB); // Draw the widgets m_playPauseButton.draw(context); m_volumeUpButton.draw(context); m_volumeSliderButton.draw(context); m_volumeDownButton.draw(context); m_timeSliderButton.draw(context); m_exitFullscreenButton.draw(context); m_volumeSlider.draw(context); m_timeSlider.draw(context); // Draw the text strings FontDescription desc; NONCLIENTMETRICS metrics; metrics.cbSize = sizeof(metrics); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0); FontFamily family; family.setFamily(metrics.lfSmCaptionFont.lfFaceName); desc.setFamily(family); desc.setComputedSize(textSize); Font font = Font(desc, 0, 0); font.update(0); String s; // The y positioning of these two text strings is tricky because they are so small. They // are currently positioned relative to the center of the slider and then down the font // height / 4 (which is actually half of font height /2), which positions the center of // the text at the center of the slider. // Left string s = timeToString(currentTime()); int fontHeight = font.fontMetrics().height(); TextRun leftText(s); context.setFillColor(Color(textColor), ColorSpaceDeviceRGB); context.drawText(font, leftText, IntPoint(windowWidth / 2 - timeSliderWidth / 2 - margin - font.width(leftText), windowHeight - margin - sliderHeight / 2 + fontHeight / 4)); // Right string s = timeToString(currentTime() - duration()); TextRun rightText(s); context.setFillColor(Color(textColor), ColorSpaceDeviceRGB); context.drawText(font, rightText, IntPoint(windowWidth / 2 + timeSliderWidth / 2 + margin, windowHeight - margin - sliderHeight / 2 + fontHeight / 4)); // Copy to the window BLENDFUNCTION blendFunction = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA}; SIZE size = { windowWidth, windowHeight }; POINT sourcePoint = {0, 0}; POINT destPoint = { m_hudPosition.x(), m_hudPosition.y() }; BOOL result = UpdateLayeredWindow(m_hudWindow, 0, &destPoint, &size, bitmapDC.get(), &sourcePoint, 0, &blendFunction, ULW_ALPHA); context.restore(); ::SelectObject(bitmapDC.get(), oldBitmap); }