Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
a86d7bdc
Commit
a86d7bdc
authored
Mar 16, 2008
by
Eric Pouech
Committed by
Alexandre Julliard
Mar 17, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
richedit: Pass left margin around when computing the size of a run, so that a…
richedit: Pass left margin around when computing the size of a run, so that a tab will get a correct size.
parent
34a4f922
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
37 additions
and
25 deletions
+37
-25
caret.c
dlls/riched20/caret.c
+5
-2
editor.h
dlls/riched20/editor.h
+3
-3
run.c
dlls/riched20/run.c
+14
-12
wrap.c
dlls/riched20/wrap.c
+15
-8
No files found.
dlls/riched20/caret.c
View file @
a86d7bdc
...
...
@@ -202,11 +202,14 @@ ME_GetCursorCoordinates(ME_TextEditor *editor, ME_Cursor *pCursor,
pSizeRun
=
run
=
tmp
;
assert
(
run
);
assert
(
run
->
type
==
diRun
);
sz
=
ME_GetRunSize
(
&
c
,
&
para
->
member
.
para
,
&
run
->
member
.
run
,
ME_StrLen
(
run
->
member
.
run
.
strText
));
sz
=
ME_GetRunSize
(
&
c
,
&
para
->
member
.
para
,
&
run
->
member
.
run
,
ME_StrLen
(
run
->
member
.
run
.
strText
),
row
->
member
.
row
.
nLMargin
);
}
}
if
(
pCursor
->
nOffset
&&
!
(
run
->
member
.
run
.
nFlags
&
MERF_SKIPPED
))
{
sz
=
ME_GetRunSize
(
&
c
,
&
para
->
member
.
para
,
&
run
->
member
.
run
,
pCursor
->
nOffset
);
sz
=
ME_GetRunSize
(
&
c
,
&
para
->
member
.
para
,
&
run
->
member
.
run
,
pCursor
->
nOffset
,
row
->
member
.
row
.
nLMargin
);
}
*
height
=
pSizeRun
->
member
.
run
.
nAscent
+
pSizeRun
->
member
.
run
.
nDescent
;
...
...
dlls/riched20/editor.h
View file @
a86d7bdc
...
...
@@ -156,13 +156,13 @@ int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset);
int
ME_GetLastSplittablePlace
(
ME_Context
*
c
,
ME_Run
*
run
);
int
ME_CanJoinRuns
(
const
ME_Run
*
run1
,
const
ME_Run
*
run2
);
void
ME_JoinRuns
(
ME_TextEditor
*
editor
,
ME_DisplayItem
*
p
);
ME_DisplayItem
*
ME_SplitRun
(
ME_
Context
*
c
,
ME_DisplayItem
*
item
,
int
nChar
);
ME_DisplayItem
*
ME_SplitRun
(
ME_
WrapContext
*
w
c
,
ME_DisplayItem
*
item
,
int
nChar
);
ME_DisplayItem
*
ME_SplitRunSimple
(
ME_TextEditor
*
editor
,
ME_DisplayItem
*
item
,
int
nChar
);
int
ME_FindSplitPoint
(
ME_Context
*
c
,
POINT
*
pt
,
ME_Run
*
run
,
int
desperate
);
void
ME_UpdateRunFlags
(
ME_TextEditor
*
editor
,
ME_Run
*
run
);
ME_DisplayItem
*
ME_SplitFurther
(
ME_TextEditor
*
editor
,
ME_DisplayItem
*
run
);
void
ME_CalcRunExtent
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
ME_Run
*
run
);
SIZE
ME_GetRunSize
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
ME_Run
*
run
,
int
nLen
);
void
ME_CalcRunExtent
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
int
startx
,
ME_Run
*
run
);
SIZE
ME_GetRunSize
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
ME_Run
*
run
,
int
nLen
,
int
startx
);
void
ME_CursorFromCharOfs
(
ME_TextEditor
*
editor
,
int
nCharOfs
,
ME_Cursor
*
pCursor
);
void
ME_RunOfsFromCharOfs
(
ME_TextEditor
*
editor
,
int
nCharOfs
,
ME_DisplayItem
**
ppRun
,
int
*
pOfs
);
int
ME_CharOfsFromRunOfs
(
ME_TextEditor
*
editor
,
ME_DisplayItem
*
pRun
,
int
nOfs
);
...
...
dlls/riched20/run.c
View file @
a86d7bdc
...
...
@@ -267,9 +267,9 @@ void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p)
* Splits a run into two in a given place. It also updates the screen position
* and size (extent) of the newly generated runs.
*/
ME_DisplayItem
*
ME_SplitRun
(
ME_
Context
*
c
,
ME_DisplayItem
*
item
,
int
nVChar
)
ME_DisplayItem
*
ME_SplitRun
(
ME_
WrapContext
*
w
c
,
ME_DisplayItem
*
item
,
int
nVChar
)
{
ME_TextEditor
*
editor
=
c
->
editor
;
ME_TextEditor
*
editor
=
wc
->
context
->
editor
;
ME_DisplayItem
*
item2
=
NULL
;
ME_Run
*
run
,
*
run2
;
ME_Paragraph
*
para
=
&
ME_GetParagraph
(
item
)
->
member
.
para
;
...
...
@@ -291,8 +291,8 @@ ME_DisplayItem *ME_SplitRun(ME_Context *c, ME_DisplayItem *item, int nVChar)
run2
=
&
item2
->
member
.
run
;
ME_CalcRunExtent
(
c
,
para
,
run
);
ME_CalcRunExtent
(
c
,
para
,
run2
);
ME_CalcRunExtent
(
wc
->
context
,
para
,
wc
->
nRow
?
wc
->
nLeftMargin
:
wc
->
nFirstMargin
,
run
);
ME_CalcRunExtent
(
wc
->
context
,
para
,
wc
->
nRow
?
wc
->
nLeftMargin
:
wc
->
nFirstMargin
,
run2
);
run2
->
pt
.
x
=
run
->
pt
.
x
+
run
->
nWidth
;
run2
->
pt
.
y
=
run
->
pt
.
y
;
...
...
@@ -638,7 +638,7 @@ int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset)
* (nLen).
*/
static
SIZE
ME_GetRunSizeCommon
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
ME_Run
*
run
,
int
nLen
,
int
*
pAscent
,
int
*
pDescent
)
int
startx
,
int
*
pAscent
,
int
*
pDescent
)
{
SIZE
size
;
int
nMaxLen
=
ME_StrVLen
(
run
->
strText
);
...
...
@@ -668,8 +668,8 @@ static SIZE ME_GetRunSizeCommon(ME_Context *c, const ME_Paragraph *para, ME_Run
if
(
run
->
nFlags
&
MERF_TAB
)
{
int
pos
=
0
,
i
=
0
,
ppos
;
PARAFORMAT2
*
pFmt
=
para
->
pFmt
;
do
{
if
(
i
<
pFmt
->
cTabCount
)
{
...
...
@@ -681,8 +681,8 @@ static SIZE ME_GetRunSizeCommon(ME_Context *c, const ME_Paragraph *para, ME_Run
pos
+=
720
-
(
pos
%
720
);
}
ppos
=
ME_twips2pointsX
(
c
,
pos
);
if
(
ppos
>
run
->
pt
.
x
)
{
size
.
cx
=
ppos
-
run
->
pt
.
x
;
if
(
ppos
>
startx
+
run
->
pt
.
x
)
{
size
.
cx
=
ppos
-
startx
-
run
->
pt
.
x
;
break
;
}
}
while
(
1
);
...
...
@@ -711,10 +711,11 @@ static SIZE ME_GetRunSizeCommon(ME_Context *c, const ME_Paragraph *para, ME_Run
* Finds width and height (but not ascent and descent) of a part of the run
* up to given character.
*/
SIZE
ME_GetRunSize
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
ME_Run
*
run
,
int
nLen
)
SIZE
ME_GetRunSize
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
ME_Run
*
run
,
int
nLen
,
int
startx
)
{
int
asc
,
desc
;
return
ME_GetRunSizeCommon
(
c
,
para
,
run
,
nLen
,
&
asc
,
&
desc
);
return
ME_GetRunSizeCommon
(
c
,
para
,
run
,
nLen
,
startx
,
&
asc
,
&
desc
);
}
/******************************************************************************
...
...
@@ -724,14 +725,15 @@ SIZE ME_GetRunSize(ME_Context *c, const ME_Paragraph *para, ME_Run *run, int nLe
* is calculated based on whole row's ascent and descent anyway, so no need
* to use it here.
*/
void
ME_CalcRunExtent
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
ME_Run
*
run
)
void
ME_CalcRunExtent
(
ME_Context
*
c
,
const
ME_Paragraph
*
para
,
int
startx
,
ME_Run
*
run
)
{
if
(
run
->
nFlags
&
MERF_HIDDEN
)
run
->
nWidth
=
0
;
else
{
int
nEnd
=
ME_StrVLen
(
run
->
strText
);
SIZE
size
=
ME_GetRunSizeCommon
(
c
,
para
,
run
,
nEnd
,
&
run
->
nAscent
,
&
run
->
nDescent
);
SIZE
size
=
ME_GetRunSizeCommon
(
c
,
para
,
run
,
nEnd
,
startx
,
&
run
->
nAscent
,
&
run
->
nDescent
);
run
->
nWidth
=
size
.
cx
;
if
(
!
size
.
cx
)
WARN
(
"size.cx == 0
\n
"
);
...
...
dlls/riched20/wrap.c
View file @
a86d7bdc
...
...
@@ -117,7 +117,8 @@ static void ME_WrapSizeRun(ME_WrapContext *wc, ME_DisplayItem *p)
ME_UpdateRunFlags
(
wc
->
context
->
editor
,
&
p
->
member
.
run
);
ME_CalcRunExtent
(
wc
->
context
,
&
ME_GetParagraph
(
p
)
->
member
.
para
,
&
p
->
member
.
run
);
ME_CalcRunExtent
(
wc
->
context
,
&
ME_GetParagraph
(
p
)
->
member
.
para
,
wc
->
nRow
?
wc
->
nLeftMargin
:
wc
->
nFirstMargin
,
&
p
->
member
.
run
);
}
static
ME_DisplayItem
*
ME_MaximizeSplit
(
ME_WrapContext
*
wc
,
ME_DisplayItem
*
p
,
int
i
)
...
...
@@ -128,7 +129,7 @@ static ME_DisplayItem *ME_MaximizeSplit(ME_WrapContext *wc, ME_DisplayItem *p, i
return
NULL
;
j
=
ME_ReverseFindNonWhitespaceV
(
p
->
member
.
run
.
strText
,
i
);
if
(
j
>
0
)
{
pp
=
ME_SplitRun
(
wc
->
context
,
piter
,
j
);
pp
=
ME_SplitRun
(
wc
,
piter
,
j
);
wc
->
pt
.
x
+=
piter
->
member
.
run
.
nWidth
;
return
pp
;
}
...
...
@@ -147,7 +148,7 @@ static ME_DisplayItem *ME_MaximizeSplit(ME_WrapContext *wc, ME_DisplayItem *p, i
if
(
piter
->
member
.
run
.
nFlags
&
MERF_ENDWHITE
)
{
j
=
ME_ReverseFindNonWhitespaceV
(
piter
->
member
.
run
.
strText
,
i
);
pp
=
ME_SplitRun
(
wc
->
context
,
piter
,
i
);
pp
=
ME_SplitRun
(
wc
,
piter
,
i
);
wc
->
pt
=
pp
->
member
.
run
.
pt
;
return
pp
;
}
...
...
@@ -202,7 +203,7 @@ static ME_DisplayItem *ME_SplitByBacktracking(ME_WrapContext *wc, ME_DisplayItem
if
(
i
==
len
)
i
=
ME_ReverseFindNonWhitespaceV
(
run
->
strText
,
len
);
if
(
i
)
{
ME_DisplayItem
*
piter2
=
ME_SplitRun
(
wc
->
context
,
piter
,
i
);
ME_DisplayItem
*
piter2
=
ME_SplitRun
(
wc
,
piter
,
i
);
wc
->
pt
=
piter2
->
member
.
run
.
pt
;
return
piter2
;
}
...
...
@@ -219,7 +220,7 @@ static ME_DisplayItem *ME_SplitByBacktracking(ME_WrapContext *wc, ME_DisplayItem
TRACE
(
"Backtracking failed, trying desperate: %s
\n
"
,
debugstr_w
(
p
->
member
.
run
.
strText
->
szData
));
/* OK, no better idea, so assume we MAY split words if we can split at all*/
if
(
idesp
)
return
ME_SplitRun
(
wc
->
context
,
piter
,
idesp
);
return
ME_SplitRun
(
wc
,
piter
,
idesp
);
else
if
(
wc
->
pRowStart
&&
piter
!=
wc
->
pRowStart
)
{
...
...
@@ -235,7 +236,7 @@ static ME_DisplayItem *ME_SplitByBacktracking(ME_WrapContext *wc, ME_DisplayItem
int
pos2
=
ME_StrRelPos
(
run
->
strText
,
0
,
&
chars
);
if
(
pos2
!=
len
)
{
/* the run is more than 1 char, so we may split */
return
ME_SplitRun
(
wc
->
context
,
piter
,
pos2
);
return
ME_SplitRun
(
wc
,
piter
,
pos2
);
}
/* the run is one char, can't split it */
return
piter
;
...
...
@@ -272,7 +273,7 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
black
=
ME_FindNonWhitespaceV
(
run
->
strText
,
0
);
if
(
black
)
{
wc
->
bOverflown
=
FALSE
;
pp
=
ME_SplitRun
(
wc
->
context
,
p
,
black
);
pp
=
ME_SplitRun
(
wc
,
p
,
black
);
p
->
member
.
run
.
nFlags
|=
MERF_SKIPPED
;
ME_InsertRowStart
(
wc
,
pp
);
return
pp
;
...
...
@@ -290,6 +291,12 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
return
p
;
}
/* we're not at the end of the row */
if
(
run
->
nFlags
&
MERF_TAB
)
{
/* force recomputation of tabs' size as it depends on position */
ME_CalcRunExtent
(
wc
->
context
,
&
ME_GetParagraph
(
p
)
->
member
.
para
,
wc
->
nRow
?
wc
->
nLeftMargin
:
wc
->
nFirstMargin
,
run
);
}
/* will current run fit? */
if
(
wc
->
pt
.
x
+
run
->
nWidth
>
wc
->
nAvailWidth
)
{
...
...
@@ -315,7 +322,7 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
{
/* we aren't sure if it's *really* necessary, it's a good start however */
int
black
=
ME_ReverseFindNonWhitespaceV
(
run
->
strText
,
len
);
ME_SplitRun
(
wc
->
context
,
p
,
black
);
ME_SplitRun
(
wc
,
p
,
black
);
/* handle both parts again */
return
p
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment