From d877e86adcb5074d86bfb3b709aebe0ee0c8804e Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Wed, 6 Mar 2019 17:20:19 +0800 Subject: [PATCH] New API description for GetShapedGlyphsBasic, GetShapedGlyphsComplex, GetGlyphsExtentInfo, and GetGlyphsPositionInfo --- include/gdi.h | 243 +++++++++++++++++++++++++++++++++++--- src/newgdi/Makefile.am | 2 +- src/newgdi/shaped-glyph.c | 94 +++++++++++++++ 3 files changed, 322 insertions(+), 17 deletions(-) create mode 100644 src/newgdi/shaped-glyph.c diff --git a/include/gdi.h b/include/gdi.h index 9381c009..3cb0335d 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -11297,13 +11297,9 @@ MG_EXPORT int GUIAPI AChars2UChars(LOGFONT* logfont, const Achar32* chs, /** @} end of glyph_render_flags */ -#define GLYPH_HANGED_NONE 0 -#define GLYPH_HANGED_START 1 -#define GLYPH_HANGED_END 2 - -#define GLYPH_ORIENTATION_UPRIGHT 0 -#define GLYPH_ORIENTATION_SIDEWAYS 1 - +/** + * The glyph type. + */ typedef enum _GlyphType { GLYPH_TYPE_STANDALONE, GLYPH_TYPE_STDBASE, @@ -11311,6 +11307,9 @@ typedef enum _GlyphType { GLYPH_TYPE_STDLIGATURE, } GlyphType; +/** + * The glyph position. + */ typedef enum _GlyphPosition { GLYPH_POS_BASELINE, GLYPH_POS_STDMARK_ABOVE, @@ -11320,6 +11319,9 @@ typedef enum _GlyphPosition { GLYPH_POS_CMPCURSIVE, } GlyphPosition; +/** + * The shaped glyph. + */ typedef struct _SHAPEDGLYPH { /** The glyph value */ Glyph32 gv; @@ -11331,15 +11333,122 @@ typedef struct _SHAPEDGLYPH { Uint8 gp; } SHAPEDGLYPH; -MG_EXPORT int GUIAPI GetShapedGlyphsStandard(LOGFONT* logfont, +/** + * \fn int GUIAPI GetShapedGlyphsBasic(LOGFONT* logfont, + * LanguageCode content_language, UCharScriptType writing_system, + * const Uchar32* ucs, const Uint8* break_oppos, int nr_ucs, + * SHAPEDGLYPH** glyphs, int* nr_glyphs) + * \brief Analyse and generate a shaped glyph string of a Unicode string under + * specific content language and script. + * + * This function analyses and generates a shaped glyph string (including + * the breaking opportunities of the glyphs, and the type and position + * information of them) from a Unicode string and the breaking opportunities + * of all Unicode characters under the specified content language + * \a content_language, and the writing system \a writing_system. + * + * This function perform the basic shaping process according to the Unicode + * character properties. The shaping process includes: + * + * - Shaping (substituting) glyphs. + * - Assigning the breaking opportunities. + * - Re-ordering. + * - Positioning glyphs. + * + * You can also call \a GetShapedGlyphsComplex to perform the shaping process + * based on the data contained in the OpenType Layout tables. + * + * Note that you are responsible for freeing the buffer for + * the shaped glyph string allocated by this function. + * + * \param logfont The logfont used to parse the string. + * Note that the charset/encoding of this logfont should be Unicode, + * such as UTF-8, UTF-16LE, and UTF-16BE. + * \param content_language The content lanuage identifier. + * \param writing_system The writing system (script) identifier. + * \param ucs The pointer to the UChar32 array which contains the Unicode + * characters. + * \param break_oppos The pointer to a Uint16 array which contains + * the break opportunities of the Unicode characters. + * \param nr_ucs The number of the Unicode characters. + * \param glyphs The pointer to a buffer to store the pointer of the + * generated SHAPEDGLYPH array. + * \param nr_glyphs The buffer to store the number of the generated glyphs. + * + * \return The number of the Unicode characters processed; zero on error. + * + * \note Only available when support for UNICODE is enabled. + * + * \sa GetUCharsAndBreaks, GetShapedGlyphsComplex, SHAPEDGLYPH + * GetGlyphsExtentInfo, GetGlyphsPositionInfo, DrawGlyphStringEx + */ +MG_EXPORT int GUIAPI GetShapedGlyphsBasic(LOGFONT* logfont, LanguageCode content_language, UCharScriptType writing_system, - const Uchar32* ucs, const Uint8* break_oppos, int nr_chars, - SHAPEDGLYPH* glyphs, int* nr_glyphs); + const Uchar32* ucs, const Uint8* break_oppos, int nr_ucs, + SHAPEDGLYPH** glyphs, int* nr_glyphs); +/** + * \fn int GUIAPI GetShapedGlyphsComplex(LOGFONT* logfont, + * LanguageCode content_language, UCharScriptType writing_system, + * const Uchar32* ucs, const Uint8* break_oppos, int nr_ucs, + * SHAPEDGLYPH** glyphs, int* nr_glyphs) + * \brief Analyse and generate a shaped glyph string of a Unicode string under + * specific content language and script. + * + * This function analyses and generates a shaped glyph string (including + * the breaking opportunities of the glyphs, and the type and the position + * information of them) from a Unicode string and the breaking opportunities + * of all Unicode characters under the specified content language + * \a content_language, and the writing system \a writing_system. + * + * This function perform the basic shaping process according to the data + * contained in the OpenType Layout tables (GSUB, GPOS, and so on). + * The shaping process includes: + * + * - Shaping (substituting) glyphs. + * - Assigning the breaking opportunities. + * - Re-ordering. + * - Positioning glyphs. + * + * You can also call \a GetShapedGlyphsBasic to perform the shaping process + * based on the Unicode character properties. + * + * Note that you are responsible for freeing the buffer for + * the shaped glyph string allocated by this function. + * + * \param logfont The logfont used to parse the string. + * Note that the charset/encoding of this logfont should be Unicode, + * such as UTF-8, UTF-16LE, and UTF-16BE. Also note that the font file(s) + * of the logfont should be OpenType font files, and use FreeType2 engine. + * \param content_language The content lanuage identifier. + * \param writing_system The writing system (script) identifier. + * \param ucs The pointer to the UChar32 array which contains the Unicode + * characters. + * \param break_oppos The pointer to a Uint16 array which contains + * the break opportunities of the Unicode characters. + * \param nr_ucs The number of the Unicode characters. + * \param glyphs The pointer to a buffer to store the pointer of the + * generated SHAPEDGLYPH array. + * \param nr_glyphs The buffer to store the number of the generated glyphs. + * + * \return The number of the Unicode characters processed; zero on error. + * + * \note Only available when support for UNICODE is enabled. + * + * \sa GetUCharsAndBreaks, GetShapedGlyphsBasic, SHAPEDGLYPH + * GetGlyphsExtentInfo, GetGlyphsPositionInfo, DrawGlyphStringEx + */ MG_EXPORT int GUIAPI GetShapedGlyphsComplex(LOGFONT* logfont, LanguageCode content_language, UCharScriptType writing_system, const Uchar32* ucs, const Uint8* break_oppos, int nr_chars, - SHAPEDGLYPH* glyphs, int* nr_glyphs); + SHAPEDGLYPH** glyphs, int* nr_glyphs); + +#define GLYPH_ORIENTATION_UPRIGHT 0 +#define GLYPH_ORIENTATION_SIDEWAYS 1 + +#define GLYPH_HANGED_NONE 0 +#define GLYPH_HANGED_START 1 +#define GLYPH_HANGED_END 2 /** * The glyph extent information. @@ -11371,9 +11480,52 @@ typedef struct _GLYPHEXTINFO { Uint8 orientation:2; } GLYPHEXTINFO; +/** + * \fn int GUIAPI GetGlyphsExtentInfo(LOGFONT* logfont, + * const SHAPEDGLYPH* glyphs, int nr_glyphs, + * Uint32 render_flags, + * GLYPHEXTINFO* glyph_ext_info, + * LOGFONT** logfont_sideways); + * + * \brief Get the extent information of all shaped glyphs. + * + * This function gets the position information of a SHAPEDGLYPH string which can + * fit a line with the specified maximal extent. + * + * \param logfont_upright The logfont used to render the upright glyphs. + * Note that the charset/encoding of this logfont should be Unicode, + * such as UTF-8, UTF-16LE, and UTF-16BE. + * \param glyphs The pointer to the SHAPEDGLYPH string. + * \param nr_glyphs The number of the glyphs. + * \param render_flags The render flags; see \a glyph_render_flags. + * \param glyph_ext_info The GLYPHEXTINFO array storing the extent info of all glyphs. + * \param logfont_sideways The buffer to store the LOGFONT object created + * by this function for sideways glyphs if text orientation specified + * in \a render_flags is mixed (GRF_TEXT_ORIENTATION_MIXED) or + * sideways (GRF_TEXT_ORIENTATION_SIDEWAYS). If *logfont_sidways is + * not NULL, this function will try to use this LOGFONT object for + * sideways glyphs. + * + * \return The number of shaped glyphs which are fit to the maximal extent. + * The extra_x and extra_y fields of the glyph extent info of every glyph + * may be changed due to the spacing value and justification. + * The line extent info will be returned through \a line_size + * if it was not NULL. Note the function will return immediately if + * it encounters a mandatory breaking. + * + * \note Only available when support for UNICODE is enabled. + * + * \note The LOGFONT object \a logfont_upright should have the rotation + * be 0° for upright glyphs and \a logfont_sideways will have the + * rotation be 90° for sideways glyphs. + * + * \sa GetUCharsAndBreaks, GetShapedGlyphsBasic, GetShapedGlyphsComplex, + * GetGlyphsPositionInfo, DrawGlyphStringEx, GLYPHEXTINFO, glyph_render_flags + */ MG_EXPORT int GUIAPI GetGlyphsExtentInfo(LOGFONT* logfont, - const SHAPEDGLYPH* glyphs, Uint32 render_flags, - GLYPHEXTINFO** glyph_extent_info, + const SHAPEDGLYPH* glyphs, int nr_glyphs, + Uint32 render_flags, + GLYPHEXTINFO* glyph_ext_info, LOGFONT** logfont_sideways); /** @@ -11416,11 +11568,70 @@ typedef struct _GLYPHPOS { Uint8 hanged:2; } GLYPHPOS; -MG_EXPORT int GUIAPI GetGlyphsPositionInfo(LOGFONT* logfont_upright, +/** + * \fn int GUIAPI GetGlyphsPositionInfo( + * LOGFONT* logfont_upright, LOGFONT* logfont_sideways, + * const SHAPEDGLYPH* glyphs, GLYPHEXTINFO* glyph_ext_info, int nr_glyphs, + * Uint32 render_flags, int x, int y, + * int letter_spacing, int word_spacing, int tab_size, int max_extent, + * SIZE* line_size, GLYPHPOS* glyph_pos); + * + * \brief Get the position info of all shaped glyphs fitting in the specified + * maximal output extent. + * + * This function gets the position information of a SHAPEDGLYPH string which can + * fit a line with the specified maximal extent. + * + * \param logfont_upright The logfont used to render the upright glyphs. + * Note that the charset/encoding of this logfont should be Unicode, + * such as UTF-8, UTF-16LE, and UTF-16BE. + * \param logfont_sideways The LOGFONT object used to render the sideways glyphs. + * \param glyphs The pointer to the SHAPEDGLYPH string. + * \param glyph_ext_info The GLYPHEXTINFO array storing the extent info of all glyphs. + * \param nr_glyphs The number of the glyphs. + * \param render_flags The render flags; see \a glyph_render_flags. + * \param x The x-position of first glyph. + * \param y The y-position of first glyph. + * \param letter_spacing This parameter specifies additional spacing + * (commonly called tracking) between adjacent glyphs. + * \param word_spacing This parameter specifies the additional spacing between + * words. + * \param tab_size The tab size used to render preserved tab characters. + * \param max_extent The maximal output extent value. No limit when it is < 0. + * \param line_size The buffer to store the line extent info; can be NULL. + * \param glyph_pos The buffer to store the positions and orientations of + * all glyphs which can fit in the max extent; cannot be NULL. + * + * \return The number of shaped glyphs which are fit to the maximal extent. + * The extra_x and extra_y fields of the glyph extent info of every glyph + * may be changed due to the spacing value and justification. + * The line extent info will be returned through \a line_size + * if it was not NULL. Note the function will return immediately if + * it encounters a mandatory breaking. + * + * \note Only available when support for UNICODE is enabled. + * + * \note The LOGFONT object \a logfont_upright should have the rotation + * be 0° for upright glyphs and \a logfont_sideways will have the + * rotation be 90° for sideways glyphs. + * + * \note The position coordinates of the first glyph are + * with respect to the top-left corner of the output rectangle + * if the writing mode is GRF_WRITING_MODE_HORIZONTAL_TB or + * GRF_WRITING_MODE_VERTICAL_LR, otherwise they are with respect + * to the top-right corner of the output rectangle. However, + * the positions contained in \a glyph_pos are always with respect to + * the top-left corner of the resulting output line rectangle. + * + * \sa GetUCharsAndBreaks, GetShapedGlyphsBasic, GetShapedGlyphsComplex, + * GetGlyphsExtentInfo, DrawGlyphStringEx, GLYPHEXTINFO, glyph_render_flags + */ +MG_EXPORT int GUIAPI GetGlyphsPositionInfo( + LOGFONT* logfont_upright, LOGFONT* logfont_sideways, const SHAPEDGLYPH* glyphs, GLYPHEXTINFO* glyph_ext_info, int nr_glyphs, Uint32 render_flags, int x, int y, int letter_spacing, int word_spacing, int tab_size, int max_extent, - SIZE* line_size, GLYPHPOS* glyph_pos, LOGFONT** logfont_sideways); + SIZE* line_size, GLYPHPOS* glyph_pos); /** * \fn int GUIAPI GetGlyphsExtentFromUChars(LOGFONT* logfont_upright, @@ -11479,7 +11690,7 @@ MG_EXPORT int GUIAPI GetGlyphsPositionInfo(LOGFONT* logfont_upright, * * \note This function ignore the special types (such as diacritic mark, * vowel, contextual form, ligature, and so on) of the Unicode characters. - * Please see \a GetShapedGlyphsStandard and \a GetShapedGlyphsComplex + * Please see \a GetShapedGlyphsBasic and \a GetShapedGlyphsComplex * for the purpose of shaping glyphs according to the language, script * (writing system), and the contextual shape features. * diff --git a/src/newgdi/Makefile.am b/src/newgdi/Makefile.am index 446d68a0..897f4bb3 100644 --- a/src/newgdi/Makefile.am +++ b/src/newgdi/Makefile.am @@ -13,7 +13,7 @@ SRC_FILES = gdi.c attr.c clip.c map.c coor.c rect.c \ region.c generators.c polygon.c flood.c \ advapi.c midash.c mispans.c miwideline.c \ mifillarc.c mifpolycon.c miarc.c rotatebmp.c \ - text.c achar.c glyph.c bidi.c glyph-unicode.c \ + text.c achar.c glyph.c bidi.c glyph-unicode.c shaped-glyph.c \ textout.c tabbedtextout.c drawtext.c endif diff --git a/src/newgdi/shaped-glyph.c b/src/newgdi/shaped-glyph.c new file mode 100644 index 00000000..7b54fda0 --- /dev/null +++ b/src/newgdi/shaped-glyph.c @@ -0,0 +1,94 @@ +/* + * 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 + * . + */ + +/* +** shaped-glyph.c: The implementation of APIs related shaped-glyphs +** +** Reference: +** +** https://docs.microsoft.com/en-us/typography/opentype/spec/ +** +** Create by WEI Yongming at 2019/03/06 +*/ + +#include +#include +#include + +#include "common.h" +#include "minigui.h" +#include "gdi.h" +#include "window.h" +#include "devfont.h" +#include "unicode-ops.h" + +#ifdef _MGCHARSET_UNICODE + +int GUIAPI GetShapedGlyphsBasic(LOGFONT* logfont, + LanguageCode content_language, UCharScriptType writing_system, + const Uchar32* ucs, const Uint8* break_oppos, int nr_chars, + SHAPEDGLYPH** glyphs, int* nr_glyphs) +{ + return 0; +} + +int GUIAPI GetShapedGlyphsComplex(LOGFONT* logfont, + LanguageCode content_language, UCharScriptType writing_system, + const Uchar32* ucs, const Uint8* break_oppos, int nr_chars, + SHAPEDGLYPH** glyphs, int* nr_glyphs) +{ + return 0; +} + +int GUIAPI GetGlyphsExtentInfo(LOGFONT* logfont, + const SHAPEDGLYPH* glyphs, int nr_glyphs, + Uint32 render_flags, + GLYPHEXTINFO* glyph_extent_info, + LOGFONT** logfont_sideways) +{ + return 0; +} + +int GUIAPI GetGlyphsPositionInfo( + LOGFONT* logfont_upright, LOGFONT* logfont_sideways, + const SHAPEDGLYPH* glyphs, GLYPHEXTINFO* glyph_ext_info, int nr_glyphs, + Uint32 render_flags, int x, int y, + int letter_spacing, int word_spacing, int tab_size, int max_extent, + SIZE* line_size, GLYPHPOS* glyph_pos) +{ + return 0; +} + +#endif /* _MGCHARSET_UNICODE */ +