ReactOS  0.4.15-dev-1201-gb2cf5a4
style.c File Reference
#include "editor.h"
Include dependency graph for style.c:

Go to the source code of this file.

Macros

#define COPY_STYLE_ITEM(mask, member)
 
#define COPY_STYLE_ITEM_MEMCPY(mask, member)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (richedit)
 
 WINE_DECLARE_DEBUG_CHANNEL (richedit_style)
 
BOOL cfany_to_cf2w (CHARFORMAT2W *to, const CHARFORMAT2W *from)
 
BOOL cf2w_to_cfany (CHARFORMAT2W *to, const CHARFORMAT2W *from)
 
ME_StyleME_MakeStyle (CHARFORMAT2W *style)
 
void ME_InitCharFormat2W (CHARFORMAT2W *pFmt)
 
ME_StyleME_ApplyStyle (ME_TextEditor *editor, ME_Style *sSrc, CHARFORMAT2W *mod)
 
void ME_CopyCharFormat (CHARFORMAT2W *pDest, const CHARFORMAT2W *pSrc)
 
static void ME_DumpStyleEffect (char **p, const char *name, const CHARFORMAT2W *fmt, int mask)
 
void ME_DumpStyle (ME_Style *s)
 
void ME_DumpStyleToBuf (CHARFORMAT2W *pFmt, char buf[2048])
 
static void ME_LogFontFromStyle (ME_Context *c, LOGFONTW *lf, const ME_Style *s)
 
void ME_CharFormatFromLogFont (HDC hDC, const LOGFONTW *lf, CHARFORMAT2W *fmt)
 
static BOOL ME_IsFontEqual (const LOGFONTW *p1, const LOGFONTW *p2)
 
static void release_font_cache (ME_FontCacheItem *item)
 
void select_style (ME_Context *c, ME_Style *s)
 
void ME_DestroyStyle (ME_Style *s)
 
void ME_AddRefStyle (ME_Style *s)
 
void ME_ReleaseStyle (ME_Style *s)
 
ME_StyleME_GetInsertStyle (ME_TextEditor *editor, int nCursor)
 
void ME_SaveTempStyle (ME_TextEditor *editor, ME_Style *style)
 
void ME_ClearTempStyle (ME_TextEditor *editor)
 
void ME_SetDefaultCharFormat (ME_TextEditor *editor, CHARFORMAT2W *mod)
 

Variables

static int all_refs = 0
 

Macro Definition Documentation

◆ COPY_STYLE_ITEM

#define COPY_STYLE_ITEM (   mask,
  member 
)
Value:
if (mod->dwMask & mask) { \
fmt.dwMask |= mask;\
fmt.member = mod->member;\
}
GLenum GLint GLuint mask
Definition: glext.h:6028
static int mod
Definition: i386-dis.c:1273

Definition at line 138 of file style.c.

◆ COPY_STYLE_ITEM_MEMCPY

#define COPY_STYLE_ITEM_MEMCPY (   mask,
  member 
)
Value:
if (mod->dwMask & mask) { \
fmt.dwMask |= mask;\
CopyMemory(fmt.member, mod->member, sizeof(mod->member));\
}
GLenum GLint GLuint mask
Definition: glext.h:6028
Definition: dsound.c:943
static int mod
Definition: i386-dis.c:1273

Definition at line 144 of file style.c.

Function Documentation

◆ cf2w_to_cfany()

BOOL cf2w_to_cfany ( CHARFORMAT2W to,
const CHARFORMAT2W from 
)

Definition at line 79 of file style.c.

80 {
81  assert(from->cbSize == sizeof(CHARFORMAT2W));
82  if (to->cbSize == sizeof(CHARFORMATA))
83  {
84  CHARFORMATA *t = (CHARFORMATA *)to;
85  CopyMemory(t, from, FIELD_OFFSET(CHARFORMATA, szFaceName));
86  WideCharToMultiByte(CP_ACP, 0, from->szFaceName, -1, t->szFaceName, sizeof(t->szFaceName), NULL, NULL);
87  t->cbSize = sizeof(*t); /* it was overwritten by CopyMemory */
88  t->dwMask &= CFM_ALL;
89  t->dwEffects &= CFM_EFFECTS;
90  return TRUE;
91  }
92  if (to->cbSize == sizeof(CHARFORMATW))
93  {
94  CHARFORMATW *t = (CHARFORMATW *)to;
95  CopyMemory(t, from, sizeof(*t));
96  t->cbSize = sizeof(*t); /* it was overwritten by CopyMemory */
97  t->dwMask &= CFM_ALL;
98  t->dwEffects &= CFM_EFFECTS;
99  return TRUE;
100  }
101  if (to->cbSize == sizeof(CHARFORMAT2A))
102  {
103  CHARFORMAT2A *t = (CHARFORMAT2A *)to;
104  /* copy the A structure without face name */
105  CopyMemory(t, from, FIELD_OFFSET(CHARFORMATA, szFaceName));
106  /* convert face name */
107  WideCharToMultiByte(CP_ACP, 0, from->szFaceName, -1, t->szFaceName, sizeof(t->szFaceName), NULL, NULL);
108  /* copy the rest of the 2A structure to 2W */
109  CopyMemory(&t->wWeight, &from->wWeight, sizeof(CHARFORMAT2W)-FIELD_OFFSET(CHARFORMAT2W,wWeight));
110  t->cbSize = sizeof(*t); /* it was overwritten by CopyMemory */
111  return TRUE;
112  }
113  if (to->cbSize == sizeof(CHARFORMAT2W))
114  {
115  CopyMemory(to, from, sizeof(CHARFORMAT2W));
116  return TRUE;
117  }
118  return FALSE;
119 }
#define WideCharToMultiByte
Definition: compat.h:111
#define TRUE
Definition: types.h:120
#define CP_ACP
Definition: compat.h:109
GLdouble GLdouble t
Definition: gl.h:2047
#define assert(x)
Definition: debug.h:53
#define CFM_EFFECTS
Definition: richedit.h:364
#define FALSE
Definition: types.h:117
smooth NULL
Definition: ftsmooth.c:416
#define CopyMemory
Definition: winbase.h:1646
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define CFM_ALL
Definition: richedit.h:387
CardRegion * from
Definition: spigame.cpp:19

Referenced by ME_HandleMessage().

◆ cfany_to_cf2w()

BOOL cfany_to_cf2w ( CHARFORMAT2W to,
const CHARFORMAT2W from 
)

Definition at line 36 of file style.c.

37 {
38  if (from->cbSize == sizeof(CHARFORMATA))
39  {
41  CopyMemory(to, f, FIELD_OFFSET(CHARFORMATA, szFaceName));
42  to->cbSize = sizeof(CHARFORMAT2W);
43  if (f->dwMask & CFM_FACE) {
44  MultiByteToWideChar(CP_ACP, 0, f->szFaceName, -1, to->szFaceName, ARRAY_SIZE(to->szFaceName));
45  }
46  return TRUE;
47  }
48  if (from->cbSize == sizeof(CHARFORMATW))
49  {
51  CopyMemory(to, f, sizeof(*f));
52  /* theoretically, we don't need to zero the remaining memory */
53  ZeroMemory(&to->wWeight, sizeof(CHARFORMAT2W)-FIELD_OFFSET(CHARFORMAT2W, wWeight));
54  to->cbSize = sizeof(CHARFORMAT2W);
55  return TRUE;
56  }
57  if (from->cbSize == sizeof(CHARFORMAT2A))
58  {
60  /* copy the A structure without face name */
61  CopyMemory(to, f, FIELD_OFFSET(CHARFORMATA, szFaceName));
62  /* convert face name */
63  if (f->dwMask & CFM_FACE)
64  MultiByteToWideChar(CP_ACP, 0, f->szFaceName, -1, to->szFaceName, ARRAY_SIZE(to->szFaceName));
65  /* copy the rest of the 2A structure to 2W */
66  CopyMemory(&to->wWeight, &f->wWeight, sizeof(CHARFORMAT2A)-FIELD_OFFSET(CHARFORMAT2A, wWeight));
67  to->cbSize = sizeof(CHARFORMAT2W);
68  return TRUE;
69  }
70  if (from->cbSize == sizeof(CHARFORMAT2W))
71  {
72  CopyMemory(to, from, sizeof(CHARFORMAT2W));
73  return TRUE;
74  }
75 
76  return FALSE;
77 }
WORD wWeight
Definition: richedit.h:314
#define TRUE
Definition: types.h:120
#define CP_ACP
Definition: compat.h:109
#define CFM_FACE
Definition: richedit.h:360
#define ZeroMemory
Definition: winbase.h:1648
#define FALSE
Definition: types.h:117
GLfloat f
Definition: glext.h:7540
#define CopyMemory
Definition: winbase.h:1646
WCHAR szFaceName[LF_FACESIZE]
Definition: richedit.h:313
#define ARRAY_SIZE(a)
Definition: main.h:24
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define MultiByteToWideChar
Definition: compat.h:110
struct _charformat2w CHARFORMAT2W
CardRegion * from
Definition: spigame.cpp:19

Referenced by handle_EM_SETCHARFORMAT(), and ME_MakeFirstParagraph().

◆ ME_AddRefStyle()

void ME_AddRefStyle ( ME_Style s)

Definition at line 454 of file style.c.

455 {
456  assert(s->nRefs>0); /* style with 0 references isn't supposed to exist */
457  s->nRefs++;
458  all_refs++;
459  TRACE_(richedit_style)("ME_AddRefStyle %p, new refs=%d, total refs=%d\n", s, s->nRefs, all_refs);
460 }
#define assert(x)
Definition: debug.h:53
#define TRACE_(x)
Definition: compat.h:76
static int all_refs
Definition: style.c:26
GLdouble s
Definition: gl.h:2039

Referenced by add_undo_insert_run(), ME_ApplyStyle(), ME_GetInsertStyle(), ME_HandleMessage(), ME_MakeRun(), ME_RTFReadHook(), ME_SaveTempStyle(), ME_StreamIn(), para_num_init(), and RTFUngetToken().

◆ ME_ApplyStyle()

ME_Style* ME_ApplyStyle ( ME_TextEditor editor,
ME_Style sSrc,
CHARFORMAT2W mod 
)

Definition at line 156 of file style.c.

157 {
158  CHARFORMAT2W fmt = sSrc->fmt;
159  ME_Style *s;
160 
161  assert(mod->cbSize == sizeof(CHARFORMAT2W));
162  COPY_STYLE_ITEM(CFM_ANIMATION, bAnimation);
163  COPY_STYLE_ITEM(CFM_BACKCOLOR, crBackColor);
164  COPY_STYLE_ITEM(CFM_CHARSET, bCharSet);
165  COPY_STYLE_ITEM(CFM_COLOR, crTextColor);
166  COPY_STYLE_ITEM_MEMCPY(CFM_FACE, szFaceName);
167  COPY_STYLE_ITEM(CFM_KERNING, wKerning);
168  COPY_STYLE_ITEM(CFM_LCID, lcid);
170  COPY_STYLE_ITEM(CFM_REVAUTHOR, bRevAuthor);
171  if (mod->dwMask & CFM_SIZE) {
172  fmt.dwMask |= CFM_SIZE;
173  fmt.yHeight = min(mod->yHeight, yHeightCharPtsMost * 20);
174  }
175  COPY_STYLE_ITEM(CFM_SPACING, sSpacing);
176  COPY_STYLE_ITEM(CFM_STYLE, sStyle);
177  COPY_STYLE_ITEM(CFM_WEIGHT, wWeight);
178  /* FIXME: this is not documented this way, but that's the more logical */
179  COPY_STYLE_ITEM(CFM_FACE, bPitchAndFamily);
180 
181  fmt.dwEffects &= ~(mod->dwMask);
182  fmt.dwEffects |= mod->dwEffects & mod->dwMask;
183  fmt.dwMask |= mod->dwMask;
184  if (mod->dwMask & CFM_COLOR)
185  {
186  if (mod->dwEffects & CFE_AUTOCOLOR)
187  fmt.dwEffects |= CFE_AUTOCOLOR;
188  else
189  fmt.dwEffects &= ~CFE_AUTOCOLOR;
190  }
191 
192  COPY_STYLE_ITEM(CFM_UNDERLINETYPE, bUnderlineType);
193  /* If the CFM_UNDERLINE effect is not specified, set it appropriately */
194  if ((mod->dwMask & CFM_UNDERLINETYPE) && !(mod->dwMask & CFM_UNDERLINE))
195  {
196  fmt.dwMask |= CFM_UNDERLINE;
197  if (mod->bUnderlineType == CFU_UNDERLINENONE)
198  fmt.dwEffects &= ~CFE_UNDERLINE;
199  else
200  fmt.dwEffects |= CFE_UNDERLINE;
201  }
202 
203  if (mod->dwMask & CFM_BOLD && !(mod->dwMask & CFM_WEIGHT))
204  {
205  fmt.wWeight = (mod->dwEffects & CFE_BOLD) ? FW_BOLD : FW_NORMAL;
206  } else if (mod->dwMask & CFM_WEIGHT && !(mod->dwMask & CFM_BOLD)) {
207  if (mod->wWeight > FW_NORMAL)
208  fmt.dwEffects |= CFE_BOLD;
209  else
210  fmt.dwEffects &= ~CFE_BOLD;
211  }
212 
214  {
215  if (!memcmp( &s->fmt, &fmt, sizeof(fmt) ))
216  {
217  TRACE_(richedit_style)("found existing style %p\n", s);
218  ME_AddRefStyle( s );
219  return s;
220  }
221  }
222 
223  s = ME_MakeStyle( &fmt );
224  if (s)
225  list_add_head( &editor->style_list, &s->entry );
226  TRACE_(richedit_style)("created new style %p\n", s);
227  return s;
228 }
struct list style_list
Definition: editstr.h:445
#define CFM_KERNING
Definition: richedit.h:352
#define CFE_AUTOCOLOR
Definition: richedit.h:414
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define CFE_UNDERLINE
Definition: richedit.h:408
#define CFM_REVAUTHOR
Definition: richedit.h:347
#define CFM_FACE
Definition: richedit.h:360
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
#define assert(x)
Definition: debug.h:53
#define CFM_ANIMATION
Definition: richedit.h:350
#define CFM_STYLE
Definition: richedit.h:351
#define yHeightCharPtsMost
Definition: richedit.h:214
#define COPY_STYLE_ITEM(mask, member)
Definition: style.c:138
#define CFE_BOLD
Definition: richedit.h:406
#define CFU_UNDERLINENONE
Definition: richedit.h:427
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define CFM_COLOR
Definition: richedit.h:361
#define CFM_UNDERLINE
Definition: richedit.h:334
#define CFM_LCID
Definition: richedit.h:356
#define TRACE_(x)
Definition: compat.h:76
#define CFM_SIZE
Definition: richedit.h:362
#define CFM_OFFSET
Definition: richedit.h:359
#define CFM_SPACING
Definition: richedit.h:353
void ME_AddRefStyle(ME_Style *s)
Definition: style.c:454
uint32_t entry
Definition: isohybrid.c:63
GLdouble s
Definition: gl.h:2039
#define FW_BOLD
Definition: wingdi.h:377
#define CFM_BOLD
Definition: richedit.h:332
#define min(a, b)
Definition: monoChain.cc:55
#define CFM_WEIGHT
Definition: richedit.h:354
#define FW_NORMAL
Definition: wingdi.h:372
#define CFM_BACKCOLOR
Definition: richedit.h:357
int yOffset
Definition: appswitch.c:59
#define COPY_STYLE_ITEM_MEMCPY(mask, member)
Definition: style.c:144
#define CFM_UNDERLINETYPE
Definition: richedit.h:355
ME_Style * ME_MakeStyle(CHARFORMAT2W *style)
Definition: style.c:121
CHARFORMAT2W fmt
Definition: editstr.h:73
Definition: dsound.c:943
#define CFM_CHARSET
Definition: richedit.h:358
static int mod
Definition: i386-dis.c:1273

Referenced by ME_RTFCharAttrHook(), ME_SetCharFormat(), ME_SetDefaultCharFormat(), ME_SetSelectionCharFormat(), and para_num_init().

◆ ME_CharFormatFromLogFont()

void ME_CharFormatFromLogFont ( HDC  hDC,
const LOGFONTW lf,
CHARFORMAT2W fmt 
)

Definition at line 331 of file style.c.

332 {
333  int ry;
334 
337  lstrcpyW(fmt->szFaceName, lf->lfFaceName);
338  fmt->dwEffects = 0;
340  fmt->wWeight = lf->lfWeight;
341  fmt->yHeight = -lf->lfHeight*1440/ry;
342  if (lf->lfWeight > FW_NORMAL) fmt->dwEffects |= CFM_BOLD;
343  if (lf->lfItalic) fmt->dwEffects |= CFM_ITALIC;
344  if (lf->lfUnderline) fmt->dwEffects |= CFM_UNDERLINE;
345  fmt->bUnderlineType = CFU_UNDERLINE;
346  if (lf->lfStrikeOut) fmt->dwEffects |= CFM_STRIKEOUT;
347  fmt->bPitchAndFamily = lf->lfPitchAndFamily;
348  fmt->bCharSet = lf->lfCharSet;
349 }
BYTE lfPitchAndFamily
Definition: dimm.idl:71
#define CFU_UNDERLINE
Definition: richedit.h:428
LONG lfHeight
Definition: dimm.idl:59
BYTE lfCharSet
Definition: dimm.idl:67
#define CFM_FACE
Definition: richedit.h:360
#define CFM_ITALIC
Definition: richedit.h:333
void ME_InitCharFormat2W(CHARFORMAT2W *pFmt)
Definition: style.c:150
#define CFM_UNDERLINE
Definition: richedit.h:334
#define CFM_SIZE
Definition: richedit.h:362
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define CFM_STRIKEOUT
Definition: richedit.h:335
static HDC hDC
Definition: 3dtext.c:33
#define lstrcpyW
Definition: compat.h:608
#define CFM_BOLD
Definition: richedit.h:332
BYTE lfStrikeOut
Definition: dimm.idl:66
BYTE lfItalic
Definition: dimm.idl:64
#define CFM_WEIGHT
Definition: richedit.h:354
#define FW_NORMAL
Definition: wingdi.h:372
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
#define LOGPIXELSY
Definition: wingdi.h:718
LONG lfWeight
Definition: dimm.idl:63
BYTE lfUnderline
Definition: dimm.idl:65
#define CFM_UNDERLINETYPE
Definition: richedit.h:355
Definition: dsound.c:943
#define CFM_CHARSET
Definition: richedit.h:358

Referenced by ME_HandleMessage().

◆ ME_ClearTempStyle()

void ME_ClearTempStyle ( ME_TextEditor editor)

Definition at line 523 of file style.c.

524 {
525  if (!editor->pBuffer->pCharStyle) return;
527  editor->pBuffer->pCharStyle = NULL;
528 }
ME_Style * pCharStyle
Definition: editstr.h:269
ME_TextBuffer * pBuffer
Definition: editstr.h:386
smooth NULL
Definition: ftsmooth.c:416
void ME_ReleaseStyle(ME_Style *s)
Definition: style.c:462

Referenced by ME_DestroyEditor(), ME_HandleMessage(), ME_ReplaceSel(), ME_SendSelChange(), and ME_StreamIn().

◆ ME_CopyCharFormat()

void ME_CopyCharFormat ( CHARFORMAT2W pDest,
const CHARFORMAT2W pSrc 
)

Definition at line 230 of file style.c.

231 {
232  /* using this with non-2W structs is forbidden */
233  assert(pSrc->cbSize == sizeof(CHARFORMAT2W));
234  assert(pDest->cbSize == sizeof(CHARFORMAT2W));
235  *pDest = *pSrc;
236 }
#define assert(x)
Definition: debug.h:53

Referenced by ME_GetDefaultCharFormat(), ME_GetRunCharFormat(), and ME_GetSelectionCharFormat().

◆ ME_DestroyStyle()

void ME_DestroyStyle ( ME_Style s)

Definition at line 442 of file style.c.

443 {
444  list_remove( &s->entry );
445  if (s->font_cache)
446  {
447  release_font_cache( s->font_cache );
448  s->font_cache = NULL;
449  }
450  ScriptFreeCache( &s->script_cache );
451  heap_free(s);
452 }
static void release_font_cache(ME_FontCacheItem *item)
Definition: style.c:360
smooth NULL
Definition: ftsmooth.c:416
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
Definition: list.h:108
GLdouble s
Definition: gl.h:2039
HRESULT WINAPI ScriptFreeCache(SCRIPT_CACHE *psc)
Definition: usp10.c:1080
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by ME_DestroyEditor(), and ME_ReleaseStyle().

◆ ME_DumpStyle()

void ME_DumpStyle ( ME_Style s)

Definition at line 243 of file style.c.

244 {
245  char buf[2048];
246  ME_DumpStyleToBuf(&s->fmt, buf);
247  TRACE_(richedit_style)("%s\n", buf);
248 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define TRACE_(x)
Definition: compat.h:76
void ME_DumpStyleToBuf(CHARFORMAT2W *pFmt, char buf[2048])
Definition: style.c:250
GLdouble s
Definition: gl.h:2039

◆ ME_DumpStyleEffect()

static void ME_DumpStyleEffect ( char **  p,
const char name,
const CHARFORMAT2W fmt,
int  mask 
)
static

Definition at line 238 of file style.c.

239 {
240  *p += sprintf(*p, "%-22s%s\n", name, (fmt->dwMask & mask) ? ((fmt->dwEffects & mask) ? "YES" : "no") : "N/A");
241 }
#define sprintf(buf, format,...)
Definition: sprintf.c:55
GLenum GLint GLuint mask
Definition: glext.h:6028
Definition: name.c:38
GLfloat GLfloat p
Definition: glext.h:8902
Definition: dsound.c:943

Referenced by ME_DumpStyleToBuf().

◆ ME_DumpStyleToBuf()

void ME_DumpStyleToBuf ( CHARFORMAT2W pFmt,
char  buf[2048] 
)

Definition at line 250 of file style.c.

251 {
252  /* FIXME only CHARFORMAT styles implemented */
253  /* this function sucks, doesn't check for buffer overruns but it's "good enough" as for debug code */
254  char *p;
255  p = buf;
256  p += sprintf(p, "Font face: ");
257  if (pFmt->dwMask & CFM_FACE) {
258  WCHAR *q = pFmt->szFaceName;
259  while(*q) {
260  *p++ = (*q > 255) ? '?' : *q;
261  q++;
262  }
263  } else
264  p += sprintf(p, "N/A");
265 
266  if (pFmt->dwMask & CFM_SIZE)
267  p += sprintf(p, "\nFont size: %d\n", pFmt->yHeight);
268  else
269  p += sprintf(p, "\nFont size: N/A\n");
270 
271  if (pFmt->dwMask & CFM_OFFSET)
272  p += sprintf(p, "Char offset: %d\n", pFmt->yOffset);
273  else
274  p += sprintf(p, "Char offset: N/A\n");
275 
276  if (pFmt->dwMask & CFM_CHARSET)
277  p += sprintf(p, "Font charset: %d\n", (int)pFmt->bCharSet);
278  else
279  p += sprintf(p, "Font charset: N/A\n");
280 
281  /* I'm assuming CFM_xxx and CFE_xxx are the same values, fortunately it IS true wrt used flags*/
282  ME_DumpStyleEffect(&p, "Font bold:", pFmt, CFM_BOLD);
283  ME_DumpStyleEffect(&p, "Font italic:", pFmt, CFM_ITALIC);
284  ME_DumpStyleEffect(&p, "Font underline:", pFmt, CFM_UNDERLINE);
285  ME_DumpStyleEffect(&p, "Font strikeout:", pFmt, CFM_STRIKEOUT);
286  ME_DumpStyleEffect(&p, "Hidden text:", pFmt, CFM_HIDDEN);
287  p += sprintf(p, "Text color: ");
288  if (pFmt->dwMask & CFM_COLOR)
289  {
290  if (pFmt->dwEffects & CFE_AUTOCOLOR)
291  p += sprintf(p, "auto\n");
292  else
293  p += sprintf(p, "%06x\n", (int)pFmt->crTextColor);
294  }
295  else
296  p += sprintf(p, "N/A\n");
297  ME_DumpStyleEffect(&p, "Text protected:", pFmt, CFM_PROTECTED);
298 }
#define CFE_AUTOCOLOR
Definition: richedit.h:414
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define CFM_FACE
Definition: richedit.h:360
#define CFM_PROTECTED
Definition: richedit.h:336
#define CFM_ITALIC
Definition: richedit.h:333
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define CFM_COLOR
Definition: richedit.h:361
DWORD dwEffects
Definition: richedit.h:307
#define CFM_UNDERLINE
Definition: richedit.h:334
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define CFM_SIZE
Definition: richedit.h:362
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
static void ME_DumpStyleEffect(char **p, const char *name, const CHARFORMAT2W *fmt, int mask)
Definition: style.c:238
#define CFM_OFFSET
Definition: richedit.h:359
WCHAR szFaceName[LF_FACESIZE]
Definition: richedit.h:313
#define CFM_STRIKEOUT
Definition: richedit.h:335
COLORREF crTextColor
Definition: richedit.h:310
#define CFM_HIDDEN
Definition: richedit.h:340
#define CFM_BOLD
Definition: richedit.h:332
BYTE bCharSet
Definition: richedit.h:311
DWORD dwMask
Definition: richedit.h:306
GLfloat GLfloat p
Definition: glext.h:8902
LONG yHeight
Definition: richedit.h:308
#define CFM_CHARSET
Definition: richedit.h:358
LONG yOffset
Definition: richedit.h:309

Referenced by ME_DumpStyle(), and ME_KeyDown().

◆ ME_GetInsertStyle()

ME_Style* ME_GetInsertStyle ( ME_TextEditor editor,
int  nCursor 
)

Definition at line 476 of file style.c.

477 {
478  if (ME_IsSelection(editor))
479  {
480  ME_Cursor *from, *to;
481 
482  ME_GetSelection(editor, &from, &to);
483  ME_AddRefStyle(from->pRun->member.run.style);
484  return from->pRun->member.run.style;
485  }
486  if (editor->pBuffer->pCharStyle) {
488  return editor->pBuffer->pCharStyle;
489  }
490  else
491  {
492  ME_Cursor *pCursor = &editor->pCursors[nCursor];
493  ME_DisplayItem *pRunItem = pCursor->pRun;
494  ME_DisplayItem *pPrevItem = NULL;
495  if (pCursor->nOffset) {
496  ME_Run *pRun = &pRunItem->member.run;
497  ME_AddRefStyle(pRun->style);
498  return pRun->style;
499  }
500  pPrevItem = ME_FindItemBack(pRunItem, diRunOrParagraph);
501  if (pPrevItem->type == diRun)
502  {
503  ME_AddRefStyle(pPrevItem->member.run.style);
504  return pPrevItem->member.run.style;
505  }
506  else
507  {
508  ME_AddRefStyle(pRunItem->member.run.style);
509  return pRunItem->member.run.style;
510  }
511  }
512 }
ME_DIType type
Definition: editstr.h:256
ME_Style * pCharStyle
Definition: editstr.h:269
ME_Style * style
Definition: editstr.h:160
ME_TextBuffer * pBuffer
Definition: editstr.h:386
smooth NULL
Definition: ftsmooth.c:416
int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to)
Definition: caret.c:57
Definition: editstr.h:87
union tagME_DisplayItem::@525 member
void ME_AddRefStyle(ME_Style *s)
Definition: style.c:454
int nOffset
Definition: editstr.h:277
ME_Cursor * pCursors
Definition: editstr.h:387
ME_DisplayItem * pRun
Definition: editstr.h:276
BOOL ME_IsSelection(ME_TextEditor *editor)
Definition: caret.c:1533
CardRegion * from
Definition: spigame.cpp:19
ME_DisplayItem * ME_FindItemBack(ME_DisplayItem *di, ME_DIType nTypeOrClass) DECLSPEC_HIDDEN
Definition: list.c:111

Referenced by handle_enter(), ITextRange_fnSetText(), ME_Char(), ME_GetSelectionInsertStyle(), ME_HandleMessage(), ME_InsertEndParaFromCursor(), ME_InsertEndRowFromCursor(), ME_InsertOLEFromCursor(), and ME_SetSelectionCharFormat().

◆ ME_InitCharFormat2W()

void ME_InitCharFormat2W ( CHARFORMAT2W pFmt)

Definition at line 150 of file style.c.

151 {
152  ZeroMemory(pFmt, sizeof(CHARFORMAT2W));
153  pFmt->cbSize = sizeof(CHARFORMAT2W);
154 }
#define ZeroMemory
Definition: winbase.h:1648
struct _charformat2w CHARFORMAT2W

Referenced by ME_CharFormatFromLogFont(), and ME_JoinParagraphs().

◆ ME_IsFontEqual()

static BOOL ME_IsFontEqual ( const LOGFONTW p1,
const LOGFONTW p2 
)
static

Definition at line 351 of file style.c.

352 {
353  if (memcmp(p1, p2, sizeof(LOGFONTW)-sizeof(p1->lfFaceName)))
354  return FALSE;
355  if (wcscmp(p1->lfFaceName, p2->lfFaceName))
356  return FALSE;
357  return TRUE;
358 }
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72

Referenced by select_style().

◆ ME_LogFontFromStyle()

static void ME_LogFontFromStyle ( ME_Context c,
LOGFONTW lf,
const ME_Style s 
)
static

Definition at line 302 of file style.c.

303 {
304  ZeroMemory(lf, sizeof(LOGFONTW));
305  lstrcpyW(lf->lfFaceName, s->fmt.szFaceName);
306 
307  lf->lfHeight = ME_twips2pointsY(c, -s->fmt.yHeight);
308 
309  lf->lfWeight = FW_NORMAL;
310  if (s->fmt.dwEffects & s->fmt.dwMask & CFM_BOLD)
311  lf->lfWeight = FW_BOLD;
312  if (s->fmt.dwMask & CFM_WEIGHT)
313  lf->lfWeight = s->fmt.wWeight;
314  if (s->fmt.dwEffects & s->fmt.dwMask & CFM_ITALIC)
315  lf->lfItalic = 1;
316  if ((s->fmt.dwEffects & s->fmt.dwMask & CFM_UNDERLINE) &&
317  !(s->fmt.dwEffects & CFE_LINK) &&
318  s->fmt.bUnderlineType == CFU_CF1UNDERLINE)
319  lf->lfUnderline = 1;
320  if (s->fmt.dwEffects & s->fmt.dwMask & CFM_STRIKEOUT)
321  lf->lfStrikeOut = 1;
322  if (s->fmt.dwEffects & s->fmt.dwMask & (CFM_SUBSCRIPT|CFM_SUPERSCRIPT))
323  lf->lfHeight = (lf->lfHeight*2)/3;
324 /*lf.lfQuality = PROOF_QUALITY; */
325  if (s->fmt.dwMask & CFM_FACE)
326  lf->lfPitchAndFamily = s->fmt.bPitchAndFamily;
327  if (s->fmt.dwMask & CFM_CHARSET)
328  lf->lfCharSet = s->fmt.bCharSet;
329 }
BYTE lfPitchAndFamily
Definition: dimm.idl:71
#define CFM_SUBSCRIPT
Definition: richedit.h:348
LONG lfHeight
Definition: dimm.idl:59
BYTE lfCharSet
Definition: dimm.idl:67
#define CFM_FACE
Definition: richedit.h:360
#define CFM_SUPERSCRIPT
Definition: richedit.h:349
#define ZeroMemory
Definition: winbase.h:1648
#define CFM_ITALIC
Definition: richedit.h:333
#define CFE_LINK
Definition: richedit.h:411
#define CFM_UNDERLINE
Definition: richedit.h:334
#define CFU_CF1UNDERLINE
Definition: richedit.h:447
const GLubyte * c
Definition: glext.h:8905
GLdouble s
Definition: gl.h:2039
#define CFM_STRIKEOUT
Definition: richedit.h:335
#define FW_BOLD
Definition: wingdi.h:377
#define lstrcpyW
Definition: compat.h:608
#define CFM_BOLD
Definition: richedit.h:332
BYTE lfStrikeOut
Definition: dimm.idl:66
BYTE lfItalic
Definition: dimm.idl:64
int ME_twips2pointsY(const ME_Context *c, int y) DECLSPEC_HIDDEN
Definition: paint.c:161
#define CFM_WEIGHT
Definition: richedit.h:354
#define FW_NORMAL
Definition: wingdi.h:372
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
LONG lfWeight
Definition: dimm.idl:63
BYTE lfUnderline
Definition: dimm.idl:65
#define CFM_CHARSET
Definition: richedit.h:358

Referenced by select_style().

◆ ME_MakeStyle()

ME_Style* ME_MakeStyle ( CHARFORMAT2W style)

Definition at line 121 of file style.c.

122 {
123  ME_Style *s = heap_alloc(sizeof(*s));
124 
125  assert(style->cbSize == sizeof(CHARFORMAT2W));
126  s->fmt = *style;
127  s->nRefs = 1;
128  s->font_cache = NULL;
129  memset(&s->tm, 0, sizeof(s->tm));
130  s->tm.tmAscent = -1;
131  s->script_cache = NULL;
132  list_init(&s->entry);
133  all_refs++;
134  TRACE_(richedit_style)("ME_MakeStyle %p, total refs=%d\n", s, all_refs);
135  return s;
136 }
#define assert(x)
Definition: debug.h:53
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
smooth NULL
Definition: ftsmooth.c:416
#define TRACE_(x)
Definition: compat.h:76
static int all_refs
Definition: style.c:26
GLdouble s
Definition: gl.h:2039
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
Arabic default style
Definition: afstyles.h:93
#define memset(x, y, z)
Definition: compat.h:39

Referenced by ME_ApplyStyle(), and ME_MakeFirstParagraph().

◆ ME_ReleaseStyle()

void ME_ReleaseStyle ( ME_Style s)

Definition at line 462 of file style.c.

463 {
464  s->nRefs--;
465  all_refs--;
466  if (s->nRefs==0)
467  TRACE_(richedit_style)("destroy style %p, total refs=%d\n", s, all_refs);
468  else
469  TRACE_(richedit_style)("release style %p, new refs=%d, total refs=%d\n", s, s->nRefs, all_refs);
470  if (!all_refs) TRACE("all style references freed (good!)\n");
471  assert(s->nRefs>=0);
472  if (!s->nRefs)
474 }
void ME_DestroyStyle(ME_Style *s)
Definition: style.c:442
#define assert(x)
Definition: debug.h:53
#define TRACE_(x)
Definition: compat.h:76
#define TRACE(s)
Definition: solgame.cpp:4
static int all_refs
Definition: style.c:26
GLdouble s
Definition: gl.h:2039

Referenced by destroy_undo_item(), handle_enter(), ITextRange_fnSetText(), ME_Char(), ME_ClearTempStyle(), ME_DestroyDisplayItem(), ME_DestroyEditor(), ME_HandleMessage(), ME_InsertEndParaFromCursor(), ME_InsertEndRowFromCursor(), ME_InsertOLEFromCursor(), ME_ReplaceSel(), ME_RTFCharAttrHook(), ME_RTFReadHook(), ME_SaveTempStyle(), ME_SetCharFormat(), ME_SetDefaultCharFormat(), ME_SetSelectionCharFormat(), ME_StreamIn(), and para_num_clear().

◆ ME_SaveTempStyle()

void ME_SaveTempStyle ( ME_TextEditor editor,
ME_Style style 
)

Definition at line 514 of file style.c.

515 {
516  ME_Style *old_style = editor->pBuffer->pCharStyle;
517 
518  if (style) ME_AddRefStyle( style );
519  editor->pBuffer->pCharStyle = style;
520  if (old_style) ME_ReleaseStyle( old_style );
521 }
ME_Style * pCharStyle
Definition: editstr.h:269
ME_TextBuffer * pBuffer
Definition: editstr.h:386
void ME_AddRefStyle(ME_Style *s)
Definition: style.c:454
void ME_ReleaseStyle(ME_Style *s)
Definition: style.c:462
Arabic default style
Definition: afstyles.h:93

Referenced by handle_enter(), and ME_HandleMessage().

◆ ME_SetDefaultCharFormat()

void ME_SetDefaultCharFormat ( ME_TextEditor editor,
CHARFORMAT2W mod 
)

Definition at line 540 of file style.c.

541 {
542  ME_Style *style, *def = editor->pBuffer->pDefaultStyle;
543 
544  assert(mod->cbSize == sizeof(CHARFORMAT2W));
545  style = ME_ApplyStyle(editor, def, mod);
546  def->fmt = style->fmt;
547  def->tm = style->tm;
548  if (def->font_cache)
549  {
551  def->font_cache = NULL;
552  }
553  ScriptFreeCache( &def->script_cache );
555  ME_MarkAllForWrapping( editor );
556 }
#define assert(x)
Definition: debug.h:53
TEXTMETRICW tm
Definition: editstr.h:76
static void release_font_cache(ME_FontCacheItem *item)
Definition: style.c:360
ME_TextBuffer * pBuffer
Definition: editstr.h:386
smooth NULL
Definition: ftsmooth.c:416
ME_Style * pDefaultStyle
Definition: editstr.h:270
ME_FontCacheItem * font_cache
Definition: editstr.h:75
void ME_ReleaseStyle(ME_Style *s)
Definition: style.c:462
void ME_MarkAllForWrapping(ME_TextEditor *editor) DECLSPEC_HIDDEN
Definition: para.c:236
SCRIPT_CACHE script_cache
Definition: editstr.h:78
HRESULT WINAPI ScriptFreeCache(SCRIPT_CACHE *psc)
Definition: usp10.c:1080
ME_Style * ME_ApplyStyle(ME_TextEditor *editor, ME_Style *sSrc, CHARFORMAT2W *mod)
Definition: style.c:156
Arabic default style
Definition: afstyles.h:93
CHARFORMAT2W fmt
Definition: editstr.h:73
static int mod
Definition: i386-dis.c:1273

Referenced by handle_EM_SETCHARFORMAT(), ME_HandleMessage(), and ME_MakeFirstParagraph().

◆ release_font_cache()

static void release_font_cache ( ME_FontCacheItem item)
static

Definition at line 360 of file style.c.

361 {
362  if (item->nRefs > 0)
363  {
364  item->nRefs--;
365  item->nAge = 0;
366  }
367 }
static ATOM item
Definition: dde.c:856

Referenced by ME_DestroyStyle(), ME_SetDefaultCharFormat(), and select_style().

◆ select_style()

void select_style ( ME_Context c,
ME_Style s 
)

Definition at line 369 of file style.c.

370 {
371  HFONT old_font;
372  LOGFONTW lf;
373  int i, empty, age = 0x7FFFFFFF;
375 
376  if (c->current_style == s) return;
377 
378  if (s)
379  {
380  ME_LogFontFromStyle( c, &lf, s );
381 
382  for (i = 0; i < HFONT_CACHE_SIZE; i++)
383  c->editor->pFontCache[i].nAge++;
384  for (i = 0, empty = -1, age = 0; i < HFONT_CACHE_SIZE; i++)
385  {
386  item = &c->editor->pFontCache[i];
387  if (!item->nRefs)
388  {
389  if (item->nAge > age)
390  {
391  empty = i;
392  age = item->nAge;
393  }
394  }
395 
396  if (item->hFont && ME_IsFontEqual( &item->lfSpecs, &lf ))
397  break;
398  }
399 
400  if (i < HFONT_CACHE_SIZE) /* found */
401  {
402  item = &c->editor->pFontCache[i];
403  TRACE_(richedit_style)( "font reused %d\n", i );
404  item->nRefs++;
405  }
406  else
407  {
408  assert(empty != -1);
409  item = &c->editor->pFontCache[empty];
410  if (item->hFont)
411  {
412  TRACE_(richedit_style)( "font deleted %d\n", empty );
413  DeleteObject(item->hFont);
414  item->hFont = NULL;
415  }
416  item->hFont = CreateFontIndirectW( &lf );
417  TRACE_(richedit_style)( "font created %d\n", empty );
418  item->nRefs = 1;
419  item->lfSpecs = lf;
420  }
421  s->font_cache = item;
422  old_font = SelectObject( c->hDC, item->hFont );
423  GetTextMetricsW( c->hDC, &s->tm );
424  if (!c->orig_font) c->orig_font = old_font;
425  }
426  else
427  {
428  SelectObject( c->hDC, c->orig_font );
429  c->orig_font = NULL;
430  }
431 
432  if (c->current_style)
433  {
434  release_font_cache( c->current_style->font_cache );
435  c->current_style->font_cache = NULL;
436  }
437  c->current_style = s;
438 
439  return;
440 }
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
Definition: text.c:221
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1499
#define assert(x)
Definition: debug.h:53
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
static BOOL ME_IsFontEqual(const LOGFONTW *p1, const LOGFONTW *p2)
Definition: style.c:351
static void release_font_cache(ME_FontCacheItem *item)
Definition: style.c:360
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
smooth NULL
Definition: ftsmooth.c:416
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
#define TRACE_(x)
Definition: compat.h:76
const GLubyte * c
Definition: glext.h:8905
#define for
Definition: utility.h:88
static void ME_LogFontFromStyle(ME_Context *c, LOGFONTW *lf, const ME_Style *s)
Definition: style.c:302
GLdouble s
Definition: gl.h:2039
static ATOM item
Definition: dde.c:856
BOOL empty
Definition: button.c:170
#define HFONT_CACHE_SIZE
Definition: editstr.h:69
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)

Referenced by draw_para_number(), draw_space(), ME_CharFromPointContext(), ME_DestroyContext(), ME_DrawTextWithStyle(), ME_GetTextExtent(), para_num_init(), and shape_run().

◆ WINE_DECLARE_DEBUG_CHANNEL()

WINE_DECLARE_DEBUG_CHANNEL ( richedit_style  )

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( richedit  )

Variable Documentation

◆ all_refs

int all_refs = 0
static

Definition at line 26 of file style.c.

Referenced by ME_AddRefStyle(), ME_MakeStyle(), and ME_ReleaseStyle().