1 // Scintilla source code edit control
\r
3 ** Defines the font and colour style for a class of text.
\r
5 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
\r
6 // The License.txt file describes the conditions under which this software may be distributed.
\r
10 #include "Platform.h"
\r
12 #include "Scintilla.h"
\r
15 #ifdef SCI_NAMESPACE
\r
16 using namespace Scintilla;
\r
20 aliasOfDefaultFont = true;
\r
21 Clear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),
\r
22 Platform::DefaultFontSize(), 0, SC_CHARSET_DEFAULT,
\r
23 false, false, false, false, caseMixed, true, true, false);
\r
26 Style::Style(const Style &source) {
\r
27 Clear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),
\r
29 false, false, false, false, caseMixed, true, true, false);
\r
30 fore.desired = source.fore.desired;
\r
31 back.desired = source.back.desired;
\r
32 characterSet = source.characterSet;
\r
34 italic = source.italic;
\r
36 eolFilled = source.eolFilled;
\r
37 underline = source.underline;
\r
38 caseForce = source.caseForce;
\r
39 visible = source.visible;
\r
40 changeable = source.changeable;
\r
41 hotspot = source.hotspot;
\r
45 if (aliasOfDefaultFont)
\r
49 aliasOfDefaultFont = false;
\r
52 Style &Style::operator=(const Style &source) {
\r
53 if (this == &source)
\r
55 Clear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),
\r
56 0, 0, SC_CHARSET_DEFAULT,
\r
57 false, false, false, false, caseMixed, true, true, false);
\r
58 fore.desired = source.fore.desired;
\r
59 back.desired = source.back.desired;
\r
60 characterSet = source.characterSet;
\r
62 italic = source.italic;
\r
64 eolFilled = source.eolFilled;
\r
65 underline = source.underline;
\r
66 caseForce = source.caseForce;
\r
67 visible = source.visible;
\r
68 changeable = source.changeable;
\r
72 void Style::Clear(ColourDesired fore_, ColourDesired back_, int size_,
\r
73 const char *fontName_, int characterSet_,
\r
74 bool bold_, bool italic_, bool eolFilled_,
\r
75 bool underline_, ecaseForced caseForce_,
\r
76 bool visible_, bool changeable_, bool hotspot_) {
\r
77 fore.desired = fore_;
\r
78 back.desired = back_;
\r
79 characterSet = characterSet_;
\r
83 fontName = fontName_;
\r
84 eolFilled = eolFilled_;
\r
85 underline = underline_;
\r
86 caseForce = caseForce_;
\r
88 changeable = changeable_;
\r
90 if (aliasOfDefaultFont)
\r
94 aliasOfDefaultFont = false;
\r
97 void Style::ClearTo(const Style &source) {
\r
99 source.fore.desired,
\r
100 source.back.desired,
\r
103 source.characterSet,
\r
114 bool Style::EquivalentFontTo(const Style *other) const {
\r
115 if (bold != other->bold ||
\r
116 italic != other->italic ||
\r
117 size != other->size ||
\r
118 characterSet != other->characterSet)
\r
120 if (fontName == other->fontName)
\r
124 if (!other->fontName)
\r
126 return strcmp(fontName, other->fontName) == 0;
\r
129 void Style::Realise(Surface &surface, int zoomLevel, Style *defaultStyle, bool extraFontFlag) {
\r
130 sizeZoomed = size + zoomLevel;
\r
131 if (sizeZoomed <= 2) // Hangs if sizeZoomed <= 1
\r
134 if (aliasOfDefaultFont)
\r
138 int deviceHeight = surface.DeviceHeightFont(sizeZoomed);
\r
139 aliasOfDefaultFont = defaultStyle &&
\r
140 (EquivalentFontTo(defaultStyle) || !fontName);
\r
141 if (aliasOfDefaultFont) {
\r
142 font.SetID(defaultStyle->font.GetID());
\r
143 } else if (fontName) {
\r
144 font.Create(fontName, characterSet, deviceHeight, bold, italic, extraFontFlag);
\r
149 ascent = surface.Ascent(font);
\r
150 descent = surface.Descent(font);
\r
151 // Probably more typographically correct to include leading
\r
152 // but that means more complex drawing as leading must be erased
\r
153 //lineHeight = surface.ExternalLeading() + surface.Height();
\r
154 externalLeading = surface.ExternalLeading(font);
\r
155 lineHeight = surface.Height(font);
\r
156 aveCharWidth = surface.AverageCharWidth(font);
\r
157 spaceWidth = surface.WidthChar(font, ' ');
\r