Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_SW_SOURCE_CORE_INC_DRAWFONT_HXX
21 : #define INCLUDED_SW_SOURCE_CORE_INC_DRAWFONT_HXX
22 :
23 : #include <tools/solar.h>
24 : #include <osl/diagnose.h>
25 : #include <vcl/vclptr.hxx>
26 : #include <vcl/outdev.hxx>
27 :
28 : class SwTextFrm;
29 : class SwViewShell;
30 : class SwScriptInfo;
31 : class Point;
32 : class SwWrongList;
33 : class Size;
34 : class SwFont;
35 : namespace vcl {
36 : class Font;
37 : class TextLayoutCache;
38 : typedef OutputDevice RenderContext;
39 : }
40 : class SwUnderlineFont;
41 :
42 : // encapsulates information for drawing text
43 164317 : class SwDrawTextInfo
44 : {
45 : const SwTextFrm* pFrm;
46 : VclPtr<OutputDevice> pOut;
47 : SwViewShell const * pSh;
48 : const SwScriptInfo* pScriptInfo;
49 : Point m_aPos;
50 : vcl::TextLayoutCache const* m_pCachedVclData;
51 : OUString m_aText;
52 : const SwWrongList* pWrong;
53 : const SwWrongList* pGrammarCheck;
54 : const SwWrongList* pSmartTags;
55 : Size m_aSize;
56 : SwFont *pFnt;
57 : SwUnderlineFont* pUnderFnt;
58 : sal_Int32* pHyphPos;
59 : long nLeft;
60 : long nRight;
61 : long nKanaDiff;
62 : sal_Int32 nIdx;
63 : sal_Int32 nLen;
64 : sal_Int32 nOfst;
65 : sal_uInt16 nWidth;
66 : sal_uInt16 nAscent;
67 : sal_uInt16 nCompress;
68 : long nSperren;
69 : long nSpace;
70 : long nKern;
71 : sal_Int32 nNumberOfBlanks;
72 : sal_uInt8 nCursorBidiLevel;
73 : bool bBullet : 1;
74 : bool bUpper : 1; // for small caps: upper case flag
75 : bool bDrawSpace : 1; // for small caps: underline/ line through
76 : bool bGreyWave : 1; // grey wave line for extended text input
77 : // For underlining we need to know, if a section is right in front of a
78 : // whole block or a fix margin section.
79 : bool bSpaceStop : 1;
80 : bool bSnapToGrid : 1; // Does paragraph snap to grid?
81 : // Paint text as if text has LTR direction, used for line numbering
82 : bool bIgnoreFrmRTL : 1;
83 : // GetCrsrOfst should not return the next position if screen position is
84 : // inside second half of bound rect, used for Accessibility
85 : bool bPosMatchesBounds :1;
86 :
87 : SwDrawTextInfo(); // prohibited
88 : public:
89 :
90 : #ifdef DBG_UTIL
91 : // These flags should control that the appropriate Set-function has been
92 : // called before calling the Get-function of a member
93 : bool m_bPos : 1;
94 : bool m_bWrong : 1;
95 : bool m_bGrammarCheck : 1;
96 : bool m_bSize : 1;
97 : bool m_bFnt : 1;
98 : bool m_bHyph : 1;
99 : bool m_bLeft : 1;
100 : bool m_bRight : 1;
101 : bool m_bKana : 1;
102 : bool m_bOfst : 1;
103 : bool m_bAscent: 1;
104 : bool m_bSperr : 1;
105 : bool m_bSpace : 1;
106 : bool m_bNumberOfBlanks : 1;
107 : bool m_bUppr : 1;
108 : bool m_bDrawSp: 1;
109 : #endif
110 :
111 164317 : SwDrawTextInfo( SwViewShell const *pS, OutputDevice &rO, const SwScriptInfo* pSI,
112 : const OUString &rSt, sal_Int32 nI, sal_Int32 nL,
113 : sal_uInt16 nW = 0, bool bB = false,
114 : vcl::TextLayoutCache const*const pCachedVclData = nullptr)
115 164317 : : m_pCachedVclData(pCachedVclData)
116 : {
117 164317 : pFrm = NULL;
118 164317 : pSh = pS;
119 164317 : pOut = &rO;
120 164317 : pScriptInfo = pSI;
121 164317 : m_aText = rSt;
122 164317 : nIdx = nI;
123 164317 : nLen = nL;
124 164317 : nKern = 0;
125 164317 : nCompress = 0;
126 164317 : nWidth = nW;
127 164317 : nNumberOfBlanks = 0;
128 164317 : nCursorBidiLevel = 0;
129 164317 : bBullet = bB;
130 164317 : pUnderFnt = 0;
131 164317 : bGreyWave = false;
132 164317 : bSpaceStop = false;
133 164317 : bSnapToGrid = false;
134 164317 : bIgnoreFrmRTL = false;
135 164317 : bPosMatchesBounds = false;
136 :
137 : // These values are initialized but have to be set explicitly via their
138 : // Set-function before they may be accessed by their Get-function:
139 164317 : pWrong = 0;
140 164317 : pGrammarCheck = 0;
141 164317 : pSmartTags = 0;
142 164317 : pFnt = 0;
143 164317 : pHyphPos = 0;
144 164317 : nLeft = 0;
145 164317 : nRight = 0;
146 164317 : nKanaDiff = 0;
147 164317 : nOfst = 0;
148 164317 : nAscent = 0;
149 164317 : nSperren = 0;
150 164317 : nSpace = 0;
151 164317 : bUpper = false;
152 164317 : bDrawSpace = false;
153 :
154 : #ifdef DBG_UTIL
155 : // these flags control whether the matching member variables have been
156 : // set by using the Set-function before they may be accessed by their
157 : // Get-function:
158 : m_bPos = m_bWrong = m_bGrammarCheck = m_bSize = m_bFnt = m_bAscent =
159 : m_bSpace = m_bNumberOfBlanks = m_bUppr =
160 : m_bDrawSp = m_bLeft = m_bRight = m_bKana = m_bOfst = m_bHyph =
161 : m_bSperr = false;
162 : #endif
163 164317 : }
164 :
165 461666 : const SwTextFrm* GetFrm() const
166 : {
167 461666 : return pFrm;
168 : }
169 :
170 164287 : void SetFrm( const SwTextFrm* pNewFrm )
171 : {
172 164287 : pFrm = pNewFrm;
173 164287 : }
174 :
175 451723 : SwViewShell const *GetShell() const
176 : {
177 451723 : return pSh;
178 : }
179 :
180 1154695 : vcl::RenderContext& GetOut() const
181 : {
182 1154695 : return *pOut;
183 : }
184 :
185 251531 : vcl::RenderContext *GetpOut() const
186 : {
187 251531 : return pOut;
188 : }
189 :
190 20940 : const SwScriptInfo* GetScriptInfo() const
191 : {
192 20940 : return pScriptInfo;
193 : }
194 :
195 66536 : const Point &GetPos() const
196 : {
197 : #ifdef DBG_UTIL
198 : OSL_ENSURE( m_bPos, "DrawTextInfo: Undefined Position" );
199 : #endif
200 66536 : return m_aPos;
201 : }
202 :
203 40311 : sal_Int32 *GetHyphPos() const
204 : {
205 : #ifdef DBG_UTIL
206 : OSL_ENSURE( m_bHyph, "DrawTextInfo: Undefined Hyph Position" );
207 : #endif
208 40311 : return pHyphPos;
209 : }
210 :
211 143909 : vcl::TextLayoutCache const* GetVclCache() const
212 : {
213 143909 : return m_pCachedVclData;
214 : }
215 :
216 1294820 : const OUString &GetText() const
217 : {
218 1294820 : return m_aText;
219 : }
220 :
221 26966 : const SwWrongList* GetWrong() const
222 : {
223 : #ifdef DBG_UTIL
224 : OSL_ENSURE( m_bWrong, "DrawTextInfo: Undefined WrongList" );
225 : #endif
226 26966 : return pWrong;
227 : }
228 :
229 20890 : const SwWrongList* GetGrammarCheck() const
230 : {
231 : #ifdef DBG_UTIL
232 : OSL_ENSURE( m_bGrammarCheck, "DrawTextInfo: Undefined GrammarCheck List" );
233 : #endif
234 20890 : return pGrammarCheck;
235 : }
236 :
237 21563 : const SwWrongList* GetSmartTags() const
238 : {
239 21563 : return pSmartTags;
240 : }
241 :
242 3084 : const Size &GetSize() const
243 : {
244 : #ifdef DBG_UTIL
245 : OSL_ENSURE( m_bSize, "DrawTextInfo: Undefined Size" );
246 : #endif
247 3084 : return m_aSize;
248 : }
249 :
250 780787 : SwFont* GetFont() const
251 : {
252 : #ifdef DBG_UTIL
253 : OSL_ENSURE( m_bFnt, "DrawTextInfo: Undefined Font" );
254 : #endif
255 780787 : return pFnt;
256 : }
257 :
258 20730 : SwUnderlineFont* GetUnderFnt() const
259 : {
260 20730 : return pUnderFnt;
261 : }
262 :
263 1202026 : sal_Int32 GetIdx() const
264 : {
265 1202026 : return nIdx;
266 : }
267 :
268 965980 : sal_Int32 GetLen() const
269 : {
270 965980 : return nLen;
271 : }
272 :
273 22 : sal_Int32 GetOfst() const
274 : {
275 : #ifdef DBG_UTIL
276 : OSL_ENSURE( m_bOfst, "DrawTextInfo: Undefined Offset" );
277 : #endif
278 22 : return nOfst;
279 : }
280 :
281 2 : sal_Int32 GetEnd() const
282 : {
283 2 : return nIdx + nLen;
284 : }
285 :
286 : long GetLeft() const
287 : {
288 : #ifdef DBG_UTIL
289 : OSL_ENSURE( m_bLeft, "DrawTextInfo: Undefined left range" );
290 : #endif
291 : return nLeft;
292 : }
293 :
294 : long GetRight() const
295 : {
296 : #ifdef DBG_UTIL
297 : OSL_ENSURE( m_bRight, "DrawTextInfo: Undefined right range" );
298 : #endif
299 : return nRight;
300 : }
301 :
302 101935 : long GetKanaDiff() const
303 : {
304 : #ifdef DBG_UTIL
305 : OSL_ENSURE( m_bKana, "DrawTextInfo: Undefined kana difference" );
306 : #endif
307 101935 : return nKanaDiff;
308 : }
309 :
310 706 : sal_uInt16 GetWidth() const
311 : {
312 706 : return nWidth;
313 : }
314 :
315 280 : sal_uInt16 GetAscent() const
316 : {
317 : #ifdef DBG_UTIL
318 : OSL_ENSURE( m_bAscent, "DrawTextInfo: Undefined Ascent" );
319 : #endif
320 280 : return nAscent;
321 : }
322 :
323 145481 : sal_uInt16 GetKanaComp() const
324 : {
325 145481 : return nCompress;
326 : }
327 :
328 20678 : long GetSperren() const
329 : {
330 : #ifdef DBG_UTIL
331 : OSL_ENSURE( m_bSperr, "DrawTextInfo: Undefined >Sperren<" );
332 : #endif
333 20678 : return nSperren;
334 : }
335 :
336 1101047 : long GetKern() const
337 : {
338 1101047 : return nKern;
339 : }
340 :
341 26479 : long GetSpace() const
342 : {
343 : #ifdef DBG_UTIL
344 : OSL_ENSURE( m_bSpace, "DrawTextInfo: Undefined Spacing" );
345 : #endif
346 26479 : return nSpace;
347 : }
348 :
349 0 : sal_Int32 GetNumberOfBlanks() const
350 : {
351 : #ifdef DBG_UTIL
352 : OSL_ENSURE( m_bNumberOfBlanks, "DrawTextInfo::Undefined NumberOfBlanks" );
353 : #endif
354 0 : return nNumberOfBlanks;
355 : }
356 :
357 15 : sal_uInt8 GetCursorBidiLevel() const
358 : {
359 15 : return nCursorBidiLevel;
360 : }
361 :
362 21196 : bool GetBullet() const
363 : {
364 21196 : return bBullet;
365 : }
366 :
367 1660 : bool GetUpper() const
368 : {
369 : #ifdef DBG_UTIL
370 : OSL_ENSURE( m_bUppr, "DrawTextInfo: Undefined Upperflag" );
371 : #endif
372 1660 : return bUpper;
373 : }
374 :
375 71 : bool GetDrawSpace() const
376 : {
377 : #ifdef DBG_UTIL
378 : OSL_ENSURE( m_bDrawSp, "DrawTextInfo: Undefined DrawSpaceflag" );
379 : #endif
380 71 : return bDrawSpace;
381 : }
382 :
383 20959 : bool GetGreyWave() const
384 : {
385 20959 : return bGreyWave;
386 : }
387 :
388 0 : bool IsSpaceStop() const
389 : {
390 0 : return bSpaceStop;
391 : }
392 :
393 332648 : bool SnapToGrid() const
394 : {
395 332648 : return bSnapToGrid;
396 : }
397 :
398 9 : bool IsIgnoreFrmRTL() const
399 : {
400 9 : return bIgnoreFrmRTL;
401 : }
402 :
403 1 : bool IsPosMatchesBounds() const
404 : {
405 1 : return bPosMatchesBounds;
406 : }
407 :
408 3332 : void SetOut( OutputDevice &rNew )
409 : {
410 3332 : pOut = &rNew;
411 3332 : }
412 :
413 62858 : void SetPos( const Point &rNew )
414 : {
415 62858 : m_aPos = rNew;
416 : #ifdef DBG_UTIL
417 : m_bPos = true;
418 : #endif
419 62858 : }
420 :
421 40313 : void SetHyphPos( sal_Int32 *pNew )
422 : {
423 40313 : pHyphPos = pNew;
424 : #ifdef DBG_UTIL
425 : m_bHyph = true;
426 : #endif
427 40313 : }
428 :
429 104502 : void SetText( const OUString &rNew )
430 : {
431 104502 : m_aText = rNew;
432 104502 : m_pCachedVclData = nullptr; // would any case benefit from save/restore?
433 104502 : }
434 :
435 20520 : void SetWrong( const SwWrongList* pNew )
436 : {
437 20520 : pWrong = pNew;
438 : #ifdef DBG_UTIL
439 : m_bWrong = true;
440 : #endif
441 20520 : }
442 :
443 20520 : void SetGrammarCheck( const SwWrongList* pNew )
444 : {
445 20520 : pGrammarCheck = pNew;
446 : #ifdef DBG_UTIL
447 : m_bGrammarCheck = true;
448 : #endif
449 20520 : }
450 :
451 20520 : void SetSmartTags( const SwWrongList* pNew )
452 : {
453 20520 : pSmartTags = pNew;
454 20520 : }
455 :
456 1946 : void SetSize( const Size &rNew )
457 : {
458 1946 : m_aSize = rNew;
459 : #ifdef DBG_UTIL
460 : m_bSize = true;
461 : #endif
462 1946 : }
463 :
464 267785 : void SetFont( SwFont* pNew )
465 : {
466 267785 : pFnt = pNew;
467 : #ifdef DBG_UTIL
468 : m_bFnt = true;
469 : #endif
470 267785 : }
471 :
472 1802 : void SetIdx( sal_Int32 nNew )
473 : {
474 1802 : nIdx = nNew;
475 1802 : }
476 :
477 105607 : void SetLen( sal_Int32 nNew )
478 : {
479 105607 : nLen = nNew;
480 105607 : }
481 :
482 16 : void SetOfst( sal_Int32 nNew )
483 : {
484 16 : nOfst = nNew;
485 : #ifdef DBG_UTIL
486 : m_bOfst = true;
487 : #endif
488 16 : }
489 :
490 20596 : void SetLeft( long nNew )
491 : {
492 20596 : nLeft = nNew;
493 : #ifdef DBG_UTIL
494 : m_bLeft = true;
495 : #endif
496 20596 : }
497 :
498 20596 : void SetRight( long nNew )
499 : {
500 20596 : nRight = nNew;
501 : #ifdef DBG_UTIL
502 : m_bRight = true;
503 : #endif
504 20596 : }
505 :
506 105288 : void SetKanaDiff( long nNew )
507 : {
508 105288 : nKanaDiff = nNew;
509 : #ifdef DBG_UTIL
510 : m_bKana = true;
511 : #endif
512 105288 : }
513 :
514 1081 : void SetWidth( sal_uInt16 nNew )
515 : {
516 1081 : nWidth = nNew;
517 1081 : }
518 :
519 280 : void SetAscent( sal_uInt16 nNew )
520 : {
521 280 : nAscent = nNew;
522 : #ifdef DBG_UTIL
523 : m_bAscent = true;
524 : #endif
525 280 : }
526 :
527 228102 : void SetKern( long nNew )
528 : {
529 228102 : nKern = nNew;
530 228102 : }
531 :
532 20775 : void SetSpace( long nNew )
533 : {
534 20775 : if( nNew < 0 )
535 : {
536 0 : nSperren = -nNew;
537 0 : nSpace = 0;
538 : }
539 : else
540 : {
541 20775 : nSpace = nNew;
542 20775 : nSperren = 0;
543 : }
544 : #ifdef DBG_UTIL
545 : m_bSpace = true;
546 : m_bSperr = true;
547 : #endif
548 20775 : }
549 :
550 951 : void SetNumberOfBlanks( sal_Int32 nNew )
551 : {
552 : #ifdef DBG_UTIL
553 : m_bNumberOfBlanks = true;
554 : #endif
555 951 : nNumberOfBlanks = nNew;
556 951 : }
557 :
558 16 : void SetCursorBidiLevel( sal_uInt8 nNew )
559 : {
560 16 : nCursorBidiLevel = nNew;
561 16 : }
562 :
563 164167 : void SetKanaComp( short nNew )
564 : {
565 164167 : nCompress = nNew;
566 164167 : }
567 :
568 462 : void SetBullet( bool bNew )
569 : {
570 462 : bBullet = bNew;
571 462 : }
572 :
573 20585 : void SetUnderFnt( SwUnderlineFont* pULFnt )
574 : {
575 20585 : pUnderFnt = pULFnt;
576 20585 : }
577 :
578 1666 : void SetUpper( bool bNew )
579 : {
580 1666 : bUpper = bNew;
581 : #ifdef DBG_UTIL
582 : m_bUppr = true;
583 : #endif
584 1666 : }
585 :
586 220 : void SetDrawSpace( bool bNew )
587 : {
588 220 : bDrawSpace = bNew;
589 : #ifdef DBG_UTIL
590 : m_bDrawSp = true;
591 : #endif
592 220 : }
593 :
594 20515 : void SetGreyWave( bool bNew )
595 : {
596 20515 : bGreyWave = bNew;
597 20515 : }
598 :
599 20449 : void SetSpaceStop( bool bNew )
600 : {
601 20449 : bSpaceStop = bNew;
602 20449 : }
603 :
604 164287 : void SetSnapToGrid( bool bNew )
605 : {
606 164287 : bSnapToGrid = bNew;
607 164287 : }
608 :
609 106 : void SetIgnoreFrmRTL( bool bNew )
610 : {
611 106 : bIgnoreFrmRTL = bNew;
612 106 : }
613 :
614 16 : void SetPosMatchesBounds( bool bNew )
615 : {
616 16 : bPosMatchesBounds = bNew;
617 16 : }
618 :
619 : void Shift( sal_uInt16 nDir );
620 :
621 : // sets a new color at the output device if necessary if a font is passed
622 : // as argument, the change if made to the font otherwise the font at the
623 : // output device is changed returns if the font has been changed
624 : bool ApplyAutoColor( vcl::Font* pFnt = 0 );
625 : };
626 :
627 : #endif
628 :
629 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|