diff --git a/include/gdi.h b/include/gdi.h
index 9f5ef496..0f21b782 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -12201,6 +12201,12 @@ MG_EXPORT int GUIAPI UChars2AChars(LOGFONT* logfont, const Uchar32* ucs,
*/
#define GRF_OVERFLOW_WRAP_ANYWHERE 0x00200000
+#define GRF_OVERFLOW_ELLIPSIZE_MASK 0x000F0000
+#define GRF_OVERFLOW_ELLIPSIZE_NONE 0x00000000
+#define GRF_OVERFLOW_ELLIPSIZE_START 0x00010000
+#define GRF_OVERFLOW_ELLIPSIZE_MIDDLE 0x00020000
+#define GRF_OVERFLOW_ELLIPSIZE_END 0x00030000
+
#define GRF_ALIGN_MASK 0x0000F000
/**
* Text content is aligned to the start edge of the line box.
@@ -12372,6 +12378,14 @@ typedef struct _GLYPHPOS {
* The y coordinate of the glyph position.
*/
int y;
+ /**
+ * The x offset of the glyph position.
+ */
+ int x_off;
+ /**
+ * The y offset of the glyph position.
+ */
+ int y_off;
/**
* Whether suppress the glyph.
*/
@@ -12586,8 +12600,7 @@ MG_EXPORT BOOL GUIAPI DestroyTextRunsInfo(TEXTRUNSINFO* run_info);
* \sa GetUCharsUntilParagraphBoundary, GetShapedGlyphsComplex,
* GetGlyphsExtentInfo, GetGlyphsPositionInfo, DrawShapedGlyphString
*/
-MG_EXPORT BOOL GUIAPI ShapeTextRunsBaisc(TEXTRUNSINFO* run_info,
- Uint32 render_flags);
+MG_EXPORT BOOL GUIAPI InitBasicShapingEngine(TEXTRUNSINFO* run_info);
#ifdef _MGCOMPLEX_SCRIPTS
@@ -12657,11 +12670,32 @@ MG_EXPORT BOOL GUIAPI ShapeTextRunsBaisc(TEXTRUNSINFO* run_info,
* \sa GetUCharsUntilParagraphBoundary, GetShapedGlyphsBasic,
* GetGlyphsExtentInfo, GetGlyphsPositionInfo, DrawShapedGlyphString
*/
-MG_EXPORT BOOL GUIAPI ShapeTextRunsComplex(TEXTRUNSINFO* run_info,
- Uint32 render_flags);
+MG_EXPORT BOOL GUIAPI InitComplexShapingEngine(TEXTRUNSINFO* run_info);
#endif /* _MGCOMPLEX_SCRIPTS */
+typedef struct _LAYOUTINFO LAYOUTINFO;
+typedef struct _LAYOUTLINE LAYOUTLINE;
+
+MG_EXPORT LAYOUTINFO* GUIAPI CreateLayoutInfo(
+ const TEXTRUNSINFO* run_info, Uint32 render_flags,
+ const BreakOppo* break_oppos, BOOL persist_lines,
+ int letter_spacing, int word_spacing, int tab_size);
+
+MG_EXPORT BOOL GUIAPI DestroyLayoutInfo(LAYOUTINFO* layout_info);
+
+typedef void (*CB_GLYPH_LAID_OUT) (GHANDLE ctxt,
+ LOGFONT* lf, RGBCOLOR color, Glyph32 gv, const GLYPHPOS* pos);
+
+MG_EXPORT int GUIAPI LayoutNextLine(LAYOUTINFO* layout_info,
+ int* x, int* y, int max_extent, SIZE* line_size,
+ CB_GLYPH_LAID_OUT cb_laid_out, GHANDLE ctxt);
+
+MG_EXPORT int GUIAPI GetShapedGlyphsFittingLine(const TEXTRUNSINFO* run_info,
+ const BreakOppo* break_oppos,
+ int uc_start_index, int x, int y, Uint32 render_flags,
+ int letter_spacing, int word_spacing, int tab_size, int max_extent,
+ SIZE* line_size, GLYPHPOS** glyph_pos, int* nr_glyphs);
/**
* \fn int GUIAPI GetGlyphsExtentInfo()
*
diff --git a/src/newgdi/Makefile.am b/src/newgdi/Makefile.am
index 2f7b19d0..c50494bc 100644
--- a/src/newgdi/Makefile.am
+++ b/src/newgdi/Makefile.am
@@ -24,7 +24,7 @@ endif
HDR_FILES = drawtext.h mi.h midc.h mistruct.h miwideline.h \
pixel_ops.h mifillarc.h mispans.h polygon.h mifpoly.h \
- textrunsinfo.h
+ textrunsinfo.h layoutinfo.h
libnewgdi_la_SOURCES = $(SRC_FILES) $(HDR_FILES)
diff --git a/src/newgdi/layoutinfo.h b/src/newgdi/layoutinfo.h
new file mode 100644
index 00000000..7137f37b
--- /dev/null
+++ b/src/newgdi/layoutinfo.h
@@ -0,0 +1,113 @@
+/*
+ * This file is part of MiniGUI, a mature cross-platform windowing
+ * and Graphics User Interface (GUI) support system for embedded systems
+ * and smart IoT devices.
+ *
+ * Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
+ * Copyright (C) 1998~2002, WEI Yongming
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Or,
+ *
+ * As this program is a library, any link to this program must follow
+ * GNU General Public License version 3 (GPLv3). If you cannot accept
+ * GPLv3, you need to be licensed from FMSoft.
+ *
+ * If you have got a commercial license of this program, please use it
+ * under the terms and conditions of the commercial license.
+ *
+ * For more information about the commercial license, please refer to
+ * .
+ */
+
+/*
+** layoutinfo.h: Internal interface related to LAYOUTINFO.
+**
+** Create by WEI Yongming at 2019/03/20
+*/
+
+#ifndef _MG_NEWGDI_LAYOUTINFO_H
+ #define _MG_NEWGDI_LAYOUTINFO_H
+
+#include "list.h"
+#include "textruninfo.h"
+
+typedef struct _GLYPHRUN GLYPHRUN;
+typedef struct _GLYPHINFO GLYPHINFO;
+
+struct _GLYPHINFO {
+ Glyph32 gv;
+ int x_off;
+ int y_off;
+ int width;
+
+ Uint32 is_cluster_start:1;
+};
+
+struct _GLYPHSTRING {
+ GLYPHINFO* glyphs;
+ int* log_clusters;
+
+ int nr_glyphs;
+ int reserved;
+} GLYPHSTRING;
+
+struct _GLYPHRUN {
+ struct list_head list;
+ TEXTRUN* text_run; // the text run to which this glyph run belongs
+ GLYPHSTRING* glyphstr; // the glyph string
+};
+
+struct _LAYOUTLINE {
+ struct list_head list;
+ GLYPHLAYOUTINFO* layout_info;
+ int* log_widths; // the widths of the logical chars
+
+ struct list_head run_head; // the list head for glyph runs
+
+ int idx; // the index in uchar string
+ int len; // the length in uchar string
+
+ Uint8 first_line:1; // is first line of the paragraph?
+ Uint8 resolved_dir:3; // resolved direction of the line
+ Uint8 all_even:1; // flag indicating all level is even
+ Uint8 all_odd:1; // flag indicating all level is odd
+};
+
+struct _GLYPHLAYOUTINFO {
+ const TEXTRUNSINFO* runinfo;
+ const BreakOppo* break_oppos;
+
+ Uint32 render_flags;
+ int letter_spacing;
+ int word_spacing;
+ int tab_size;
+
+ struct list_head line_head; // the list head of lines
+
+ LAYOUTLINE *curr_line; // current line
+ int idx_next_char;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // _MG_NEWGDI_LAYOUTINFO_H
+
diff --git a/src/newgdi/textrunsinfo.c b/src/newgdi/textrunsinfo.c
index e6d18fb6..08e9e0ca 100644
--- a/src/newgdi/textrunsinfo.c
+++ b/src/newgdi/textrunsinfo.c
@@ -263,8 +263,6 @@ static BOOL state_process_run (TEXTRUNSTATE *state)
run->dir = state->runinfo->run_dir;
run->ort = state->ort_rsv;
run->lf = create_logfont_for_run(state->runinfo, run);
- run->gs = NULL;
- run->ngs = 0;
run->idx = state->run_start - state->text;
run->len = state->run_end - state->run_start;
list_add_tail(&run->list, &state->runinfo->run_head);
@@ -560,7 +558,7 @@ BOOL GUIAPI SetPartFontInTextRuns(TEXTRUNSINFO* runinfo,
return FALSE;
// can not change font after shaped the glyphs
- if (runinfo->se.engine != NULL)
+ if (runinfo->sei.inst != NULL)
return FALSE;
// can not change font for empty runs
@@ -624,13 +622,11 @@ BOOL GUIAPI ResetFontInTextRuns(TEXTRUNSINFO* runinfo, const char* logfont_name)
list_del(runinfo->run_head.prev);
if (run->lf)
release_logfont_for_run(runinfo, run);
- if (runinfo->se.engine)
- runinfo->se.destroy_glyphs(runinfo->se.engine, run->gs);
free(run);
}
- if (runinfo->se.engine) {
- runinfo->se.destroy_engine(runinfo->se.engine);
+ if (runinfo->sei.inst) {
+ runinfo->sei.free(runinfo->sei.inst);
}
free(runinfo->fontname);
@@ -658,16 +654,12 @@ BOOL GUIAPI ResetDirectionInTextRuns(TEXTRUNSINFO* runinfo,
list_for_each(i, &runinfo->run_head) {
TEXTRUN* run = (TEXTRUN*)i;
- if (runinfo->se.engine && run->gs) {
- runinfo->se.destroy_glyphs(runinfo->se.engine, run->gs);
- }
-
set_run_dir(runinfo, run, run_dir, glyph_orient);
}
- if (runinfo->se.engine) {
- runinfo->se.destroy_engine(runinfo->se.engine);
- runinfo->se.engine = NULL;
+ if (runinfo->sei.inst) {
+ runinfo->sei.free(runinfo->sei.inst);
+ runinfo->sei.inst = NULL;
}
return TRUE;
@@ -722,13 +714,11 @@ BOOL GUIAPI DestroyTextRunsInfo(TEXTRUNSINFO* runinfo)
list_del(runinfo->run_head.prev);
if (run->lf)
release_logfont_for_run(runinfo, run);
- if (runinfo->se.engine)
- runinfo->se.destroy_glyphs(runinfo->se.engine, run->gs);
free(run);
}
- if (runinfo->se.engine) {
- runinfo->se.destroy_engine(runinfo->se.engine);
+ if (runinfo->sei.inst) {
+ runinfo->sei.free(runinfo->sei.inst);
}
free(runinfo->fontname);
diff --git a/src/newgdi/textrunsinfo.h b/src/newgdi/textrunsinfo.h
index bcfd22da..74c56dc5 100644
--- a/src/newgdi/textrunsinfo.h
+++ b/src/newgdi/textrunsinfo.h
@@ -43,55 +43,49 @@
#include "list.h"
-typedef Glyph32 (*CB_GET_GLYPH_INFO) (void* engine,
- void* glyph_infos, int index, int* cluster);
+typedef struct _TEXTRUN TEXTRUN;
+typedef struct _GLYPHSTRING GLYPHSTRING;
+typedef struct _SEINSTANCE SEINSTANCE;
+typedef struct _TEXTCOLORMAP TEXTCOLORMAP;
-typedef BOOL (*CB_DESTROY_GLYPHS) (void* engine, void* glyph_infos);
+typedef BOOL (*CB_SHAPE_TEXT_RUN)(SEINSTANCE* instance,
+ const TEXTRUN* run, GLYPHSTRING* gs);
-typedef BOOL (*CB_DESTROY_ENGINE) (void* engine);
+typedef BOOL (*CB_DESTROY_INSTANCE)(SEINSTANCE* instance);
-typedef struct _SHAPPINGENGINE {
- /* The pointer to the shaping engine */
- void* engine;
+typedef struct _SHAPINGENGINEINFO SHAPINGENGINEINFO;
- /* the callback reverse the glyphs */
- CB_REVERSE_ARRAY reverse_glyphs;
+struct _SHAPINGENGINEINFO {
+ /* The pointer to the shaping engine instance */
+ SEINSTANCE* inst;
- /* The callback returns the glyph value and cluster
- from a void glyph information */
- CB_GET_GLYPH_INFO get_glyph_info;
+ /* callback to shap a text run */
+ CB_SHAPE_TEXT_RUN shape;
- /* the callback destroy the shaped glyph info */
- CB_DESTROY_GLYPHS destroy_glyphs;
+ /* callback to destroy the shaping engine instance */
+ CB_DESTROY_INSTANCE free;
+};
- /* the callback destroy the shapping engine instance */
- CB_DESTROY_ENGINE destroy_engine;
-} SHAPPINGENGINE;
-
-typedef struct _TEXTRUN {
+struct _TEXTRUN {
struct list_head list;
LOGFONT* lf; // the logfont for this run
- void* gs; // the shaped glyph information
-
int idx; // start index in the Unicode string
int len; // the number of Unicode characters
- int ngs; // the number of shaped glyphs
-
Uint32 lc:8; // language code
Uint32 st:8; // script type
Uint32 el:8; // the bidi embedding level
Uint32 dir:4; // the run direction
Uint32 ort:2; // the glyph orientation
-} TEXTRUN;
+};
-typedef struct _TEXTCOLORMAP {
+struct _TEXTCOLORMAP {
struct list_head list;
int si;
int len;
RGBCOLOR color;
-} TEXTCOLORMAP;
+};
struct _TEXTRUNSINFO {
/* The following fields will be initialized by CreateGlyphRunInfo. */
@@ -110,39 +104,8 @@ struct _TEXTRUNSINFO {
Uint32 run_dir:4; // the run direction specified
Uint32 base_level:1; // the paragraph direction; 0 for LTR, 1 for RTL
- /* The following fields will be initialized by the shapping engine. */
- SHAPPINGENGINE se; // the shapping engine
-};
-
-typedef struct _GLYPHLAYOUTINFO GLYPHLAYOUTINFO;
-
-typedef struct _GLYPHRUN {
- struct list_head list;
- TEXTRUN* text_run; // the glyph run
- int start_idx; // the index in glyph run
- int nr_glyphs; // the number of glyphs
-} GLYPHRUN;
-
-typedef struct _GLYPHLINE {
- GLYPHLAYOUTINFO* layout_info;
-
- struct list_head run_head; // the list head for glyph layout runs
-
- int idx; // the index in uchar string
- int len; // the length in uchar string
-
- Uint8 first_line:1; // is first line of the paragraph?
- Uint8 resolved_dir:3; // resolved direction of the line
- Uint8 all_even:1; // flag indicating all level is even
- Uint8 all_odd:1; // flag indicating all level is odd
-} GLYPHLINE;
-
-struct _GLYPHLAYOUTINFO {
- const TEXTRUNSINFO* runinfo;
-
- struct list_head line_head;
-
- int nr_lines;
+ /* The following fields will be initialized by the shaping engine. */
+ SHAPINGENGINEINFO sei; // the shaping engine information
};
#ifdef __cplusplus