summaryrefslogtreecommitdiffstats
path: root/src/libnr
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2009-12-21 16:37:12 +0000
committerTed Gould <ted@gould.cx>2009-12-21 16:37:12 +0000
commit752a8f90d3442cdaa4689ba6de4b911ca4fda514 (patch)
tree5e0739ec9bd2ac9cbdd2a2343859f89e02dae181 /src/libnr
parentMerging in from trunk (diff)
parentUpdating the READMEs to better handle OSX. (diff)
downloadinkscape-752a8f90d3442cdaa4689ba6de4b911ca4fda514.tar.gz
inkscape-752a8f90d3442cdaa4689ba6de4b911ca4fda514.zip
Updating to current trunk
(bzr r8254.1.38)
Diffstat (limited to '')
-rw-r--r--src/libnr/Makefile_insert1
-rw-r--r--src/libnr/nr-compose-transform.cpp59
-rw-r--r--src/libnr/nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM.S414
-rw-r--r--src/libnrtype/Layout-TNG-Input.cpp69
-rw-r--r--src/libnrtype/Layout-TNG-OutIter.cpp29
-rw-r--r--src/libnrtype/Layout-TNG.h6
6 files changed, 123 insertions, 455 deletions
diff --git a/src/libnr/Makefile_insert b/src/libnr/Makefile_insert
index 5cd2717be..4b19028f9 100644
--- a/src/libnr/Makefile_insert
+++ b/src/libnr/Makefile_insert
@@ -5,7 +5,6 @@ libnr_mmx_sources = \
libnr/have_mmx.S \
libnr/nr_mmx_R8G8B8A8_P_EMPTY_A8_RGBAP.S \
libnr/nr_mmx_R8G8B8A8_P_R8G8B8A8_P_A8_RGBAP.S \
- libnr/nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM.S \
libnr/nr_mmx_R8G8B8_R8G8B8_R8G8B8A8_P.S
endif
diff --git a/src/libnr/nr-compose-transform.cpp b/src/libnr/nr-compose-transform.cpp
index afc8fd987..6e03faf2f 100644
--- a/src/libnr/nr-compose-transform.cpp
+++ b/src/libnr/nr-compose-transform.cpp
@@ -16,30 +16,25 @@
#include "nr-pixops.h"
#include "nr-matrix.h"
-
-#ifdef WITH_MMX
+/*#ifdef WITH_MMX
#ifdef __cplusplus
extern "C" {
-#endif /* __cplusplus */
-/* fixme: */
-int nr_have_mmx (void);
-void nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0 (unsigned char *px, int w, int h, int rs,
- const unsigned char *spx, int sw, int sh, int srs,
- const long *FFd2s, unsigned int alpha);
-void nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n (unsigned char *px, int w, int h, int rs,
- const unsigned char *spx, int sw, int sh, int srs,
- const long *FFd2s, const long *FF_S, unsigned int alpha, int dbits);
+#endif // __cplusplus
+/ * fixme: * /
+/ *int nr_have_mmx (void);
#define NR_PIXOPS_MMX (1 && nr_have_mmx ())
#ifdef __cplusplus
}
#endif //__cplusplus
#endif
+*/
/* fixme: Implement missing (Lauris) */
/* fixme: PREMUL colors before calculating average (Lauris) */
/* Fixed point precision */
#define FBITS 12
+#define FBITS_HP 18 // In some places we need a higher precision
void nr_R8G8B8A8_N_EMPTY_R8G8B8A8_N_TRANSFORM (unsigned char *px, int w, int h, int rs,
const unsigned char *spx, int sw, int sh, int srs,
@@ -168,10 +163,10 @@ void nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_P_TRANSFORM (unsigned char *px, int w, in
static void
nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0 (unsigned char *px, int w, int h, int rs,
const unsigned char *spx, int sw, int sh, int srs,
- const long *FFd2s, unsigned int alpha)
+ const long long *FFd2s, unsigned int alpha)
{
- unsigned char *d0;
- int FFsx0, FFsy0;
+ unsigned char *d0;
+ long long FFsx0, FFsy0;
int x, y;
d0 = px;
@@ -180,15 +175,15 @@ nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0 (unsigned char *px, int w, int h
for (y = 0; y < h; y++) {
unsigned char *d;
- long FFsx, FFsy;
+ long long FFsx, FFsy;
d = d0;
FFsx = FFsx0;
FFsy = FFsy0;
for (x = 0; x < w; x++) {
long sx, sy;
- sx = FFsx >> FBITS;
+ sx = long(FFsx >> FBITS_HP);
if ((sx >= 0) && (sx < sw)) {
- sy = FFsy >> FBITS;
+ sy = long(FFsy >> FBITS_HP);
if ((sy >= 0) && (sy < sh)) {
const unsigned char *s;
unsigned int a;
@@ -224,11 +219,11 @@ nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0 (unsigned char *px, int w, int h
static void
nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n (unsigned char *px, int w, int h, int rs,
const unsigned char *spx, int sw, int sh, int srs,
- const long *FFd2s, const long *FF_S, unsigned int alpha, int dbits)
+ const long long *FFd2s, const long *FF_S, unsigned int alpha, int dbits)
{
int size;
unsigned char *d0;
- int FFsx0, FFsy0;
+ long long FFsx0, FFsy0;
int x, y;
size = (1 << dbits);
@@ -242,7 +237,7 @@ nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n (unsigned char *px, int w, int h
for (y = 0; y < h; y++) {
unsigned char *d;
- long FFsx, FFsy;
+ long long FFsx, FFsy;
d = d0;
FFsx = FFsx0;
FFsy = FFsy0;
@@ -252,9 +247,9 @@ nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n (unsigned char *px, int w, int h
r = g = b = a = 0;
for (i = 0; i < size; i++) {
long sx, sy;
- sx = (FFsx + FF_S[2 * i]) >> FBITS;
+ sx = (long (FFsx >> (FBITS_HP - FBITS)) + FF_S[2 * i]) >> FBITS;
if ((sx >= 0) && (sx < sw)) {
- sy = (FFsy + FF_S[2 * i + 1]) >> FBITS;
+ sy = (long (FFsy >> (FBITS_HP - FBITS)) + FF_S[2 * i + 1]) >> FBITS;
if ((sy >= 0) && (sy < sh)) {
const unsigned char *s;
unsigned int ca;
@@ -302,6 +297,7 @@ void nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM (unsigned char *px, int w, in
{
int dbits;
long FFd2s[6];
+ long long FFd2s_HP[6]; // with higher precision
int i;
if (alpha == 0) return;
@@ -310,17 +306,11 @@ void nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM (unsigned char *px, int w, in
for (i = 0; i < 6; i++) {
FFd2s[i] = (long) (d2s[i] * (1 << FBITS) + 0.5);
+ FFd2s_HP[i] = (long long) (d2s[i] * (1 << FBITS_HP) + 0.5);;
}
if (dbits == 0) {
-#ifdef WITH_MMX
- if (NR_PIXOPS_MMX) {
- /* WARNING: MMX composer REQUIRES w > 0 and h > 0 */
- nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0 (px, w, h, rs, spx, sw, sh, srs, FFd2s, alpha);
- return;
- }
-#endif
- nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0 (px, w, h, rs, spx, sw, sh, srs, FFd2s, alpha);
+ nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0 (px, w, h, rs, spx, sw, sh, srs, FFd2s_HP, alpha);
} else {
int xsize, ysize;
long FFs_x_x_S, FFs_x_y_S, FFs_y_x_S, FFs_y_y_S;
@@ -344,14 +334,7 @@ void nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM (unsigned char *px, int w, in
}
}
-#ifdef WITH_MMX
- if (NR_PIXOPS_MMX) {
- /* WARNING: MMX composer REQUIRES w > 0 and h > 0 */
- nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n (px, w, h, rs, spx, sw, sh, srs, FFd2s, FF_S, alpha, dbits);
- return;
- }
-#endif
- nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n (px, w, h, rs, spx, sw, sh, srs, FFd2s, FF_S, alpha, dbits);
+ nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n (px, w, h, rs, spx, sw, sh, srs, FFd2s_HP, FF_S, alpha, dbits);
}
}
diff --git a/src/libnr/nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM.S b/src/libnr/nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM.S
deleted file mode 100644
index e30056af2..000000000
--- a/src/libnr/nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM.S
+++ /dev/null
@@ -1,414 +0,0 @@
- .file "nr-compose-transform.c"
-
-# Ensure Inkscape is execshield protected
- .section .note.GNU-stack
- .previous
-
- .text
- .align 2
-.globl nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0
- .type nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0,@function
-
-/*
- * This code is in public domain
- *
- */
-
-nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0:
- pushl %ebp
- movl %esp, %ebp
- pushl %ebx
- subl $48, %esp
- pushl %edi
- pushl %esi
-
-/* Load %mm7 with [0 0 0 0] */
- movl $0, %eax
- movd %eax, %mm7
-
-/* Load %mm6 with [128 128 128 128] */
- movl $0x80808080, %eax
- movd %eax, %mm6
- punpcklbw %mm7, %mm6
-
-/* Load %mm5 with [255 255 255 255] */
- movl $0xffffffff, %eax
- movd %eax, %mm5
- punpcklbw %mm7, %mm5
-
-/* Load %mm0 with [a a a a] */
- movzbl 44(%ebp), %eax
- movd %eax, %mm0
- punpcklwd %mm0, %mm0
- punpckldq %mm0, %mm0
-
- movl 8(%ebp), %eax
- movl %eax, -8(%ebp)
- movl 40(%ebp), %eax
- addl $16, %eax
- movl (%eax), %eax
- movl %eax, -12(%ebp)
- movl 40(%ebp), %eax
- addl $20, %eax
- movl (%eax), %eax
- movl %eax, -16(%ebp)
- movl $0, -24(%ebp)
-.L29:
- movl -24(%ebp), %eax
- cmpl 16(%ebp), %eax
- jl .L32
- jmp .L28
-.L32:
- movl -8(%ebp), %edi
-
- movl -12(%ebp), %eax
- movl %eax, %esi
- movl -16(%ebp), %eax
- movl %eax, -36(%ebp)
-
- movl 12(%ebp), %ebx
-.for_x_0:
-
- movl %esi, %ecx
- cmpl $0, %ecx
- js .clip_0
- sarl $12, %ecx
- cmpl 28(%ebp), %ecx
- jge .clip_0
- shll $2, %ecx
-
- movl -36(%ebp), %eax
- cmpl $0, %eax
- js .clip_0
- sarl $12, %eax
- cmpl 32(%ebp), %eax
- jge .clip_0
- imull 36(%ebp), %eax
-
- addl %ecx, %eax
- addl 24(%ebp), %eax
-
-/* Fg -> %mm1 */
- movl (%eax), %eax
- testl $0xff000000, %eax
- jz .clip_0
- movd %eax, %mm1
- punpcklbw %mm7, %mm1
-
-/* [a a a 255] -> %mm3 */
- shrl $24, %eax
- movl $0x10101, %edx
- mull %edx
- orl $0xff000000, %eax
- movd %eax, %mm3
- punpcklbw %mm7, %mm3
-
-/* [Fg * a] -> mm1 */
- pmullw %mm3, %mm1
- paddw %mm6, %mm1
- movq %mm1, %mm4
- psrlw $8, %mm4
- paddw %mm4, %mm1
- psrlw $8, %mm1
-
-/* Multiply by alpha */
- pmullw %mm0, %mm1
- paddw %mm6, %mm1
- movq %mm1, %mm4
- psrlw $8, %mm4
- paddw %mm4, %mm1
- psrlw $8, %mm1
-
-/* [255 - FgA] -> mm2 */
- movq %mm1, %mm2
- punpckhwd %mm2, %mm2
- punpckhdq %mm2, %mm2
- pxor %mm5, %mm2
-
-/* Bg -> mm3 */
- movd (%edi), %mm3
- punpcklbw %mm7, %mm3
-
-/* Fg + ((255 - FgA) * Bg) / 255 */
-
- pmullw %mm2, %mm3
- paddw %mm6, %mm3
- movq %mm3, %mm4
- psrlw $8, %mm4
- paddw %mm4, %mm3
- psrlw $8, %mm3
- paddw %mm1, %mm3
-
-/* Store pixel */
- packuswb %mm3, %mm3
- movd %mm3, (%edi)
-
-.clip_0:
-.L37:
- movl 40(%ebp), %ecx
- movl (%ecx), %edx
- addl %edx, %esi
- movl 4(%ecx), %edx
- addl %edx, -36(%ebp)
-
- addl $4, %edi
-
- decl %ebx
- jnz .for_x_0
-
-.L34:
- movl 8(%ecx), %edx
- addl %edx, -12(%ebp)
- movl 12(%ecx), %edx
- addl %edx, -16(%ebp)
-
- movl 20(%ebp), %edx
- leal -8(%ebp), %eax
- addl %edx, (%eax)
- leal -24(%ebp), %eax
- incl (%eax)
- jmp .L29
-.L28:
- emms
- popl %esi
- popl %edi
- addl $48, %esp
- popl %ebx
- popl %ebp
- ret
-.Lfe2:
- .size nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0,.Lfe2-nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_0
-
-/*
- *
- * dbits 52(%ebp)
- * alpha 48(%ebp)
- * FF_S 44(%ebp)
- *
- * d -32(%ebp) -> %edi
- * i -60(%ebp) -> %esi
- * sx -64(%ebp) -> %ebx
- * sy -68(%ebp)
- * s -72(%ebp)
- *
- * %mm0 a a a a
- * %mm1 FgA
- * %mm2 SumFgA
- * %mm3 a a a 255
- * %mm4
-*/
-
- .align 2
-.globl nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n
- .type nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n,@function
-nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n:
- pushl %ebp
- movl %esp, %ebp
- pushl %ebx
- subl $72, %esp
- pushl %edi
- pushl %esi
-
-/* Load %mm7 with [0 0 0 0] */
- movl $0, %eax
- movd %eax, %mm7
-
-/* Load %mm6 with [128 128 128 128] */
- movl $0x80808080, %eax
- movd %eax, %mm6
- punpcklbw %mm7, %mm6
-
-/* Load %mm5 with [255 255 255 255] */
- movl $0xffffffff, %eax
- movd %eax, %mm5
- punpcklbw %mm7, %mm5
-
-/* Load %mm0 with [a a a a] */
- movzbl 48(%ebp), %eax
- movd %eax, %mm0
- punpcklwd %mm0, %mm0
- punpckldq %mm0, %mm0
-
- movl $1, %eax
- movzbl 52(%ebp), %ecx
- sall %cl, %eax
- movl %eax, -8(%ebp)
- movl 8(%ebp), %eax
- movl %eax, -12(%ebp)
- movl 40(%ebp), %eax
- addl $16, %eax
- movl (%eax), %eax
- movl %eax, -16(%ebp)
- movl 40(%ebp), %eax
- addl $20, %eax
- movl (%eax), %eax
- movl %eax, -20(%ebp)
- movl $0, -28(%ebp)
-.L44:
- movl -28(%ebp), %eax
- cmpl 16(%ebp), %eax
- jl .L47
- jmp .exit_n
-.L47:
- movl -12(%ebp), %eax
- movl %eax, -32(%ebp)
- movl -16(%ebp), %eax
- movl %eax, -36(%ebp)
- movl -20(%ebp), %eax
- movl %eax, -40(%ebp)
- movl $0, -24(%ebp)
-.L48:
- movl -24(%ebp), %eax
- cmpl 12(%ebp), %eax
- jl .L51
- jmp .L49
-.L51:
-
-/* Zero accumulator */
- movq %mm7, %mm2
-
-/* Set i to dptr (size - 1) */
- movl -8(%ebp), %esi
- sub $1, %esi
- shll $3, %esi
-
- movl 44(%ebp), %edi
- movl -36(%ebp), %ecx
-
-.for_i_n:
- movl (%edi,%esi), %ebx
- addl %ecx, %ebx
-/* Test negative before shift */
- cmpl $0, %ebx
- js .next_i_n
- sarl $12, %ebx
- cmpl 28(%ebp), %ebx
- jge .next_i_n
-/* We multiply sx by 4 here */
- shll $2, %ebx
-
- movl 4(%edi,%esi), %eax
- addl -40(%ebp), %eax
-/* Test negative before shift */
- cmpl $0, %eax
- js .next_i_n
- sarl $12, %eax
- cmpl 32(%ebp), %eax
- jge .next_i_n
-/* We multiply sy by srs here */
- imull 36(%ebp), %eax
-
- addl %ebx, %eax
- addl 24(%ebp), %eax
-
-/* Fg -> %mm1 */
- movl (%eax), %eax
- testl $0xff000000, %eax
- jz .next_i_n
- movd %eax, %mm1
- punpcklbw %mm7, %mm1
-
-/* [a a a 255] -> %mm3 */
- shrl $24, %eax
- movl $0x10101, %edx
- mull %edx
- orl $0xff000000, %eax
- movd %eax, %mm3
- punpcklbw %mm7, %mm3
-
-/* [Fg * a] -> mm1 */
- pmullw %mm3, %mm1
- paddw %mm6, %mm1
- movq %mm1, %mm4
- psrlw $8, %mm4
- paddw %mm4, %mm1
- psrlw $8, %mm1
-
-/* Add to accumulator */
- paddw %mm1, %mm2
-
-.next_i_n:
- subl $8, %esi
- jnb .for_i_n
-
-/* Divide components by sample size */
- movd 52(%ebp), %mm3
- psrlw %mm3, %mm2
-
-/* Multiply by alpha */
- pmullw %mm0, %mm2
- paddw %mm6, %mm2
- movq %mm2, %mm4
- psrlw $8, %mm4
- paddw %mm4, %mm2
- psrlw $8, %mm2
-
-/* [255 - FgA] -> mm1 */
- movq %mm2, %mm1
- punpckhwd %mm1, %mm1
- punpckhdq %mm1, %mm1
- pxor %mm5, %mm1
-
- movl -32(%ebp), %edi
-/* Bg -> mm3 */
- movd (%edi), %mm3
- punpcklbw %mm7, %mm3
-
-/* Fg + ((255 - FgA) * Bg) / 255 */
-
- pmullw %mm1, %mm3
- paddw %mm6, %mm3
- movq %mm3, %mm4
- psrlw $8, %mm4
- paddw %mm4, %mm3
- psrlw $8, %mm3
- paddw %mm2, %mm3
-
-/* Store pixel */
- packuswb %mm3, %mm3
- movd %mm3, (%edi)
-
-.L58:
- movl 40(%ebp), %eax
- movl (%eax), %edx
- leal -36(%ebp), %eax
- addl %edx, (%eax)
- movl 40(%ebp), %eax
- addl $4, %eax
- movl (%eax), %edx
- leal -40(%ebp), %eax
- addl %edx, (%eax)
- leal -32(%ebp), %eax
- addl $4, (%eax)
- leal -24(%ebp), %eax
- incl (%eax)
- jmp .L48
-.L49:
- movl 40(%ebp), %eax
- addl $8, %eax
- movl (%eax), %edx
- leal -16(%ebp), %eax
- addl %edx, (%eax)
- movl 40(%ebp), %eax
- addl $12, %eax
- movl (%eax), %edx
- leal -20(%ebp), %eax
- addl %edx, (%eax)
- movl 20(%ebp), %edx
- leal -12(%ebp), %eax
- addl %edx, (%eax)
- leal -28(%ebp), %eax
- incl (%eax)
- jmp .L44
-
-.exit_n:
- emms
- popl %esi
- popl %edi
- addl $72, %esp
- popl %ebx
- popl %ebp
- ret
-.Lfe3:
- .size nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n,.Lfe3-nr_mmx_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_TRANSFORM_n
- .ident "GCC: (GNU) 3.2"
diff --git a/src/libnrtype/Layout-TNG-Input.cpp b/src/libnrtype/Layout-TNG-Input.cpp
index 2ee0051a4..33371ab10 100644
--- a/src/libnrtype/Layout-TNG-Input.cpp
+++ b/src/libnrtype/Layout-TNG-Input.cpp
@@ -16,8 +16,11 @@
#include "style.h"
#include "svg/svg-length.h"
#include "sp-object.h"
+#include "sp-string.h"
#include "FontFactory.h"
+#include "text-editing.h" // for inputTruncated()
+
namespace Inkscape {
namespace Text {
@@ -321,5 +324,71 @@ Layout::InputStreamTextSource::~InputStreamTextSource()
sp_style_unref(style);
}
+bool
+Layout::inputTruncated() const
+{
+ if (!inputExists())
+ return false;
+
+ // Find out the SPObject to which the last visible character corresponds:
+ Layout::iterator last = end();
+ if (last == begin()) {
+ // FIXME: this returns a wrong "not truncated" when a flowtext is entirely
+ // truncated, so there are no visible characters. But how can I find out the
+ // originator SPObject without having anything to do getSourceOfCharacter
+ // from?
+ return false;
+ }
+ last.prevCharacter();
+ void *source;
+ Glib::ustring::iterator offset;
+ getSourceOfCharacter(last, &source, &offset);
+ SPObject *obj = SP_OBJECT(source);
+
+ // if that is SPString, see if it has further characters beyond the last visible
+ if (obj && SP_IS_STRING(obj)) {
+ Glib::ustring::iterator offset_next = offset;
+ offset_next ++;
+ if (offset_next != SP_STRING(obj)->string.end()) {
+ // truncated: source SPString has next char
+ return true;
+ }
+ }
+
+ // otherwise, see if the SPObject at end() or any of its text-tree ancestors
+ // (excluding top-level SPText or SPFlowText) have a text-tree next sibling with
+ // visible text
+ if (obj) {
+ for (SPObject *ascend = obj;
+ ascend && (is_part_of_text_subtree (ascend) && !is_top_level_text_object(ascend));
+ ascend = SP_OBJECT_PARENT(ascend)) {
+ if (SP_OBJECT_NEXT(ascend)) {
+ SPObject *next = SP_OBJECT_NEXT(ascend);
+ if (next && is_part_of_text_subtree(next) && has_visible_text(next)) {
+ // truncated: source text object has next text sibling
+ return true;
+ }
+ }
+ }
+ }
+
+ // the above works for flowed text, but not for text on path.
+ // so now, we also check if the last of the _characters, if coming from a TEXT_SOURCE,
+ // has in_glyph different from -1
+ unsigned last_char = _characters.size() - 1;
+ unsigned span_index = _characters[last_char].in_span;
+ Glib::ustring::const_iterator iter_char = _spans[span_index].input_stream_first_character;
+
+ if (_input_stream[_spans[span_index].in_input_stream_item]->Type() == TEXT_SOURCE) {
+ if (_characters[last_char].in_glyph == -1) {
+ //truncated: last char has no glyph
+ return true;
+ }
+ }
+
+ // not truncated
+ return false;
+}
+
}//namespace Text
}//namespace Inkscape
diff --git a/src/libnrtype/Layout-TNG-OutIter.cpp b/src/libnrtype/Layout-TNG-OutIter.cpp
index 0fc061bfc..f4e8e4031 100644
--- a/src/libnrtype/Layout-TNG-OutIter.cpp
+++ b/src/libnrtype/Layout-TNG-OutIter.cpp
@@ -221,6 +221,31 @@ Geom::Point Layout::characterAnchorPoint(iterator const &it) const
}
}
+boost::optional<Geom::Point> Layout::baselineAnchorPoint() const
+{
+ iterator pos = this->begin();
+ Geom::Point left_pt = this->characterAnchorPoint(pos);
+ pos.thisEndOfLine();
+ Geom::Point right_pt = this->characterAnchorPoint(pos);
+ Geom::Point mid_pt = (left_pt + right_pt)/2;
+
+ switch (this->paragraphAlignment(pos)) {
+ case LEFT:
+ case FULL:
+ return left_pt;
+ break;
+ case CENTER:
+ return mid_pt;
+ break;
+ case RIGHT:
+ return right_pt;
+ break;
+ default:
+ return boost::optional<Geom::Point>();
+ break;
+ }
+}
+
Geom::Point Layout::chunkAnchorPoint(iterator const &it) const
{
unsigned chunk_index;
@@ -705,7 +730,7 @@ bool Layout::iterator::nextLineCursor(int n)
unsigned line_index = _parent_layout->_characters[_char_index].chunk(_parent_layout).in_line;
if (line_index == _parent_layout->_lines.size() - 1)
return false; // nowhere to go
- else
+ else
n = MIN (n, static_cast<int>(_parent_layout->_lines.size() - 1 - line_index));
if (_parent_layout->_lines[line_index + n].in_shape != _parent_layout->_lines[line_index].in_shape) {
// switching between shapes: adjust the stored x to compensate
@@ -728,7 +753,7 @@ bool Layout::iterator::prevLineCursor(int n)
line_index = _parent_layout->_characters[_char_index].chunk(_parent_layout).in_line;
if (line_index == 0)
return false; // nowhere to go
- else
+ else
n = MIN (n, static_cast<int>(line_index));
if (_parent_layout->_lines[line_index - n].in_shape != _parent_layout->_lines[line_index].in_shape) {
// switching between shapes: adjust the stored x to compensate
diff --git a/src/libnrtype/Layout-TNG.h b/src/libnrtype/Layout-TNG.h
index 19680b140..05b5103fc 100644
--- a/src/libnrtype/Layout-TNG.h
+++ b/src/libnrtype/Layout-TNG.h
@@ -212,6 +212,8 @@ public:
bool inputExists() const
{return !_input_stream.empty();}
+ bool inputTruncated() const;
+
/** adds a new piece of text to the end of the current list of text to
be processed. This method can only add text of a consistent style.
To add lots of different styles, call it lots of times.
@@ -480,6 +482,10 @@ public:
/** For latin text, the left side of the character, on the baseline */
Geom::Point characterAnchorPoint(iterator const &it) const;
+ /** For left aligned text, the leftmost end of the baseline
+ For rightmost text, the rightmost... you probably got it by now ;-)*/
+ boost::optional<Geom::Point> baselineAnchorPoint() const;
+
/** This is that value to apply to the x,y attributes of tspan role=line
elements, and hence it takes alignment into account. */
Geom::Point chunkAnchorPoint(iterator const &it) const;