10019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch/*
20019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
30019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
40019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved.
50019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch *
60019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * This library is free software; you can redistribute it and/or
70019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * modify it under the terms of the GNU Library General Public
80019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * License as published by the Free Software Foundation; either
90019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * version 2 of the License, or (at your option) any later version.
100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch *
110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * This library is distributed in the hope that it will be useful,
120019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
130019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Library General Public License for more details.
150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch *
160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * You should have received a copy of the GNU Library General Public License
170019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Boston, MA 02110-1301, USA.
200019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch *
210019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch */
220019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
230019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#ifndef FontBuilder_h
240019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#define FontBuilder_h
250019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h"
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/css/FontSize.h"
28f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/FontDescription.h"
296f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "platform/heap/Handle.h"
300019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/PassRefPtr.h"
310019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
32c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
330019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
340019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochclass CSSValue;
350019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochclass FontSelector;
360019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochclass RenderStyle;
370019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
380019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochclass FontDescriptionChangeScope;
390019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
400019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochclass FontBuilder {
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    STACK_ALLOCATED();
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(FontBuilder);
430019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochpublic:
440019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    FontBuilder();
450019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
460019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // FIXME: The name is probably wrong, but matches StyleResolverState callsite for consistency.
47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void initForStyleResolve(const Document&, RenderStyle*);
480019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
490019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void setInitial(float effectiveZoom);
500019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
510019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void didChangeFontParameters(bool);
520019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
530019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void inheritFrom(const FontDescription&);
540019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void fromSystemFont(CSSValueID, float effectiveZoom);
550019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setFontFamilyInitial();
570019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void setFontFamilyInherit(const FontDescription&);
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setFontFamilyValue(CSSValue*);
590019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
600019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void setWeight(FontWeight);
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void setSize(const FontDescription::Size&);
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void setStretch(FontStretch);
63e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    void setFeatureSettings(PassRefPtr<FontFeatureSettings>);
640019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void setScript(const String& locale);
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setStyle(FontStyle);
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setVariant(FontVariant);
67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void setVariantLigatures(const FontDescription::VariantLigatures&);
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setTextRendering(TextRenderingMode);
690019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void setKerning(FontDescription::Kerning);
700019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void setFontSmoothing(FontSmoothingMode);
710019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
720019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // FIXME: These need to just vend a Font object eventually.
736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    void createFont(PassRefPtrWillBeRawPtr<FontSelector>, const RenderStyle* parentStyle, RenderStyle*);
740019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void createFontForDocument(PassRefPtrWillBeRawPtr<FontSelector>, RenderStyle*);
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
770019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // FIXME: These should not be necessary eventually.
780019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void setFontDirty(bool fontDirty) { m_fontDirty = fontDirty; }
790019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // FIXME: This is only used by an ASSERT in StyleResolver. Remove?
800019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    bool fontDirty() const { return m_fontDirty; }
810019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
82e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    static FontFeatureSettings* initialFeatureSettings() { return nullptr; }
8343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    static FontDescription::GenericFamilyType initialGenericFamily() { return FontDescription::NoFamily; }
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static FontDescription::Size initialSize() { return FontDescription::Size(FontSize::initialKeywordSize(), 0.0f, false); }
85d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static TextRenderingMode initialTextRendering() { return AutoTextRendering; }
86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static FontVariant initialVariant() { return FontVariantNormal; }
87c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static FontDescription::VariantLigatures initialVariantLigatures() { return FontDescription::VariantLigatures(); }
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static FontStyle initialStyle() { return FontStyleNormal; }
89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static FontDescription::Kerning initialKerning() { return FontDescription::AutoKerning; }
90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static FontSmoothingMode initialFontSmoothing() { return AutoSmoothing; }
91c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static FontStretch initialStretch() { return FontStretchNormal; }
92e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    static FontWeight initialWeight() { return FontWeightNormal; }
93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
940019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    friend class FontDescriptionChangeScope;
95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
960019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochprivate:
970019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
980019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // FIXME: "size" arg should be first for consistency with other similar functions.
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void setSize(FontDescription&, const FontDescription::Size&);
1000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void checkForOrientationChange(RenderStyle*);
1010019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // This function fixes up the default font size if it detects that the current generic font family has changed. -dwh
1020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    void checkForGenericFamilyChange(RenderStyle*, const RenderStyle* parentStyle);
103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void updateComputedSize(RenderStyle*, const RenderStyle* parentStyle);
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void updateComputedSize(FontDescription&, RenderStyle*);
1050019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
1060019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    float getComputedSizeFromSpecifiedSize(FontDescription&, float effectiveZoom, float specifiedSize);
1070019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<const Document> m_document;
1090019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // FIXME: This member is here on a short-term lease. The plan is to remove
1100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // any notion of RenderStyle from here, allowing FontBuilder to build Font objects
1110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // directly, rather than as a byproduct of calling RenderStyle::setFontDescription.
1120019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // FontDescriptionChangeScope should be the only consumer of this member.
1130019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // If you're using it, U R DOIN IT WRONG.
1140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    RenderStyle* m_style;
1150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
1160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // Fontbuilder is responsbile for creating the Font()
1170019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // object on RenderStyle from various other font-related
1180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // properties on RenderStyle. Whenever one of those
1190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // is changed, FontBuilder tracks the need to update
1200019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    // style->font() with this bool.
1210019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    bool m_fontDirty;
12243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
12343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    friend class FontBuilderTest;
1240019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch};
1250019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
1260019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch}
1270019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
1280019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#endif
129