OSDN Git Service

Add Git official document to help
[tortoisegit/TortoiseGitJp.git] / ext / scintilla / src / Style.cxx
1 // Scintilla source code edit control\r
2 /** @file Style.cxx\r
3  ** Defines the font and colour style for a class of text.\r
4  **/\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
7 \r
8 #include <string.h>\r
9 \r
10 #include "Platform.h"\r
11 \r
12 #include "Scintilla.h"\r
13 #include "Style.h"\r
14 \r
15 #ifdef SCI_NAMESPACE\r
16 using namespace Scintilla;\r
17 #endif\r
18 \r
19 Style::Style() {\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
24 }\r
25 \r
26 Style::Style(const Style &source) {\r
27         Clear(ColourDesired(0, 0, 0), ColourDesired(0xff, 0xff, 0xff),\r
28               0, 0, 0,\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
33         bold = source.bold;\r
34         italic = source.italic;\r
35         size = source.size;\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
42 }\r
43 \r
44 Style::~Style() {\r
45         if (aliasOfDefaultFont)\r
46                 font.SetID(0);\r
47         else\r
48                 font.Release();\r
49         aliasOfDefaultFont = false;\r
50 }\r
51 \r
52 Style &Style::operator=(const Style &source) {\r
53         if (this == &source)\r
54                 return * this;\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
61         bold = source.bold;\r
62         italic = source.italic;\r
63         size = source.size;\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
69         return *this;\r
70 }\r
71 \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
80         bold = bold_;\r
81         italic = italic_;\r
82         size = size_;\r
83         fontName = fontName_;\r
84         eolFilled = eolFilled_;\r
85         underline = underline_;\r
86         caseForce = caseForce_;\r
87         visible = visible_;\r
88         changeable = changeable_;\r
89         hotspot = hotspot_;\r
90         if (aliasOfDefaultFont)\r
91                 font.SetID(0);\r
92         else\r
93                 font.Release();\r
94         aliasOfDefaultFont = false;\r
95 }\r
96 \r
97 void Style::ClearTo(const Style &source) {\r
98         Clear(\r
99                 source.fore.desired,\r
100                 source.back.desired,\r
101                 source.size,\r
102                 source.fontName,\r
103                 source.characterSet,\r
104                 source.bold,\r
105                 source.italic,\r
106                 source.eolFilled,\r
107                 source.underline,\r
108                 source.caseForce,\r
109                 source.visible,\r
110                 source.changeable,\r
111                 source.hotspot);\r
112 }\r
113 \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
119                 return false;\r
120         if (fontName == other->fontName)\r
121                 return true;\r
122         if (!fontName)\r
123                 return false;\r
124         if (!other->fontName)\r
125                 return false;\r
126         return strcmp(fontName, other->fontName) == 0;\r
127 }\r
128 \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
132                 sizeZoomed = 2;\r
133 \r
134         if (aliasOfDefaultFont)\r
135                 font.SetID(0);\r
136         else\r
137                 font.Release();\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
145         } else {\r
146                 font.SetID(0);\r
147         }\r
148 \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
158 }\r