ReactOS 0.4.17-dev-934-g091855f
arabic.c File Reference
#include "dwrite_private.h"
#include "scripts.h"
Include dependency graph for arabic.c:

Go to the source code of this file.

Classes

struct  arabic_state_table_entry
 

Enumerations

enum  arabic_shaping_action {
  ISOL , FINA , FIN2 , FIN3 ,
  MEDI , MED2 , INIT , NONE ,
  NUM_FEATURES = NONE
}
 
enum  arabic_joining_type {
  JOINING_TYPE_U = 0 , JOINING_TYPE_L = 1 , JOINING_TYPE_R = 2 , JOINING_TYPE_D = 3 ,
  JOINING_TYPE_C = JOINING_TYPE_D , JOINING_GROUP_ALAPH = 4 , JOINING_GROUP_DALATH_RISH = 5 , JOINING_TYPES = 6 ,
  JOINING_TYPE_T = 6
}
 

Functions

static BOOL feature_is_syriac (unsigned int tag)
 
static void arabic_collect_features (struct scriptshaping_context *context, struct shaping_features *features)
 
static unsigned short arabic_get_joining_type (UINT ch)
 
static void arabic_set_shaping_action (struct scriptshaping_context *context, unsigned int idx, enum arabic_shaping_action action)
 
static enum arabic_shaping_action arabic_get_shaping_action (const struct scriptshaping_context *context, unsigned int idx)
 
static void arabic_setup_masks (struct scriptshaping_context *context, const struct shaping_features *features)
 

Variables

static const unsigned int arabic_features []
 
static const struct arabic_state_table_entry arabic_state_table [][JOINING_TYPES]
 
const unsigned short arabic_shaping_table []
 
const struct shaper arabic_shaper
 

Enumeration Type Documentation

◆ arabic_joining_type

Enumerator
JOINING_TYPE_U 
JOINING_TYPE_L 
JOINING_TYPE_R 
JOINING_TYPE_D 
JOINING_TYPE_C 
JOINING_GROUP_ALAPH 
JOINING_GROUP_DALATH_RISH 
JOINING_TYPES 
JOINING_TYPE_T 

Definition at line 79 of file arabic.c.

80{
88 JOINING_TYPES = 6,
90};
@ JOINING_GROUP_ALAPH
Definition: arabic.c:86
@ JOINING_TYPES
Definition: arabic.c:88
@ JOINING_TYPE_T
Definition: arabic.c:89
@ JOINING_TYPE_C
Definition: arabic.c:85
@ JOINING_TYPE_D
Definition: arabic.c:84
@ JOINING_TYPE_L
Definition: arabic.c:82
@ JOINING_TYPE_R
Definition: arabic.c:83
@ JOINING_GROUP_DALATH_RISH
Definition: arabic.c:87
@ JOINING_TYPE_U
Definition: arabic.c:81

◆ arabic_shaping_action

Enumerator
ISOL 
FINA 
FIN2 
FIN3 
MEDI 
MED2 
INIT 
NONE 
NUM_FEATURES 

Definition at line 34 of file arabic.c.

35{
36 ISOL,
37 FINA,
38 FIN2,
39 FIN3,
40 MEDI,
41 MED2,
42 INIT,
43 NONE,
45};
@ ISOL
Definition: arabic.c:36
@ INIT
Definition: arabic.c:42
@ NUM_FEATURES
Definition: arabic.c:44
@ FINA
Definition: arabic.c:37
@ MEDI
Definition: arabic.c:40
@ MED2
Definition: arabic.c:41
@ NONE
Definition: arabic.c:43
@ FIN3
Definition: arabic.c:39
@ FIN2
Definition: arabic.c:38

Function Documentation

◆ arabic_collect_features()

static void arabic_collect_features ( struct scriptshaping_context *  context,
struct shaping_features *  features 
)
static

Definition at line 53 of file arabic.c.

55{
56 unsigned int i;
57
58 shape_enable_feature(features, DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p'), 0);
59 shape_enable_feature(features, DWRITE_MAKE_OPENTYPE_TAG('l','o','c','l'), 0);
61
62 for (i = 0; i < ARRAY_SIZE(arabic_features); ++i)
63 {
64 unsigned int flags = context->script == Script_Arabic && !feature_is_syriac(arabic_features[i]) ?
68 }
69
70 shape_enable_feature(features, DWRITE_MAKE_OPENTYPE_TAG('r','l','i','g'), FEATURE_MANUAL_ZWJ | FEATURE_HAS_FALLBACK);
71
72 shape_enable_feature(features, DWRITE_MAKE_OPENTYPE_TAG('r','c','l','t'), FEATURE_MANUAL_ZWJ);
73 shape_enable_feature(features, DWRITE_MAKE_OPENTYPE_TAG('c','a','l','t'), FEATURE_MANUAL_ZWJ);
75
76 shape_enable_feature(features, DWRITE_MAKE_OPENTYPE_TAG('m','s','e','t'), 0);
77}
static const unsigned int arabic_features[]
Definition: arabic.c:23
static BOOL feature_is_syriac(unsigned int tag)
Definition: arabic.c:47
#define ARRAY_SIZE(A)
Definition: main.h:20
#define NULL
Definition: types.h:112
void shape_start_next_stage(struct shaping_features *features, stage_func func)
Definition: shape.c:144
@ FEATURE_MANUAL_ZWJ
@ FEATURE_HAS_FALLBACK
void shape_enable_feature(struct shaping_features *features, unsigned int tag, unsigned int flags)
Definition: shape.c:138
void shape_add_feature_full(struct shaping_features *features, unsigned int tag, unsigned int flags, unsigned int value)
Definition: shape.c:117
GLbitfield flags
Definition: glext.h:7161
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
@ Script_Arabic
Definition: scripts.h:9
Definition: http.c:7252

◆ arabic_get_joining_type()

static unsigned short arabic_get_joining_type ( UINT  ch)
static

Definition at line 125 of file arabic.c.

126{
128}
const unsigned short arabic_shaping_table[]
Definition: arabic_table.c:7
unsigned char ch[4][2]
Definition: console.c:118
static unsigned short get_table_entry_32(const unsigned short *table, UINT ch)

Referenced by arabic_setup_masks().

◆ arabic_get_shaping_action()

static enum arabic_shaping_action arabic_get_shaping_action ( const struct scriptshaping_context *  context,
unsigned int  idx 
)
static

Definition at line 137 of file arabic.c.

139{
140 return (context->glyph_infos[idx].props >> 16) & 0xf;
141}
unsigned int idx
Definition: utils.c:40

Referenced by arabic_setup_masks().

◆ arabic_set_shaping_action()

static void arabic_set_shaping_action ( struct scriptshaping_context *  context,
unsigned int  idx,
enum arabic_shaping_action  action 
)
static

Definition at line 130 of file arabic.c.

132{
133 context->glyph_infos[idx].props &= ~(0xf << 16);
134 context->glyph_infos[idx].props |= (action & 0xf) << 16;
135}
action
Definition: namespace.c:707

Referenced by arabic_setup_masks().

◆ arabic_setup_masks()

static void arabic_setup_masks ( struct scriptshaping_context *  context,
const struct shaping_features *  features 
)
static

Definition at line 143 of file arabic.c.

145{
146 unsigned int i, prev = ~0u, state = 0;
147 unsigned int masks[NUM_FEATURES+1];
148
149 for (i = 0; i < context->glyph_count; ++i)
150 {
151 unsigned short this_type = arabic_get_joining_type(context->glyph_infos[i].codepoint);
152 const struct arabic_state_table_entry *entry;
153
154 if (this_type == JOINING_TYPE_T)
155 {
157 continue;
158 }
159
160 entry = &arabic_state_table[state][this_type];
161
162 if (entry->prev_action != NONE && prev != ~0u)
163 arabic_set_shaping_action(context, prev, entry->prev_action);
164
166
167 prev = i;
168 state = entry->next_state;
169 }
170
171 for (i = 0; i < NUM_FEATURES; ++i)
173 masks[NONE] = 0;
174
175 /* Unaffected glyphs get action NONE with zero mask. */
176 for (i = 0; i < context->glyph_count; ++i)
177 {
179 if (action != NONE)
181 context->glyph_infos[i].mask |= masks[action];
182 }
183}
static int state
Definition: maze.c:121
static unsigned short arabic_get_joining_type(UINT ch)
Definition: arabic.c:125
static const struct arabic_state_table_entry arabic_state_table[][JOINING_TYPES]
static void arabic_set_shaping_action(struct scriptshaping_context *context, unsigned int idx, enum arabic_shaping_action action)
Definition: arabic.c:130
static enum arabic_shaping_action arabic_get_shaping_action(const struct scriptshaping_context *context, unsigned int idx)
Definition: arabic.c:137
arabic_shaping_action
Definition: arabic.c:35
void opentype_layout_unsafe_to_break(struct scriptshaping_context *context, unsigned int start, unsigned int end)
Definition: opentype.c:5233
unsigned int shape_get_feature_1_mask(const struct shaping_features *features, unsigned int tag)
Definition: opentype.c:4822
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 * u
Definition: glfuncs.h:240
uint32_t entry
Definition: isohybrid.c:63
static const BYTE masks[8]
Definition: dib.c:3008
Definition: arabic.c:93

◆ feature_is_syriac()

static BOOL feature_is_syriac ( unsigned int  tag)
static

Definition at line 47 of file arabic.c.

48{
49 return tag == arabic_features[FIN2] || tag == arabic_features[FIN3] ||
51}
Definition: ecma_167.h:138

Referenced by arabic_collect_features().

Variable Documentation

◆ arabic_features

const unsigned int arabic_features[]
static
Initial value:
=
{
DWRITE_MAKE_OPENTYPE_TAG('i','s','o','l'),
DWRITE_MAKE_OPENTYPE_TAG('f','i','n','a'),
DWRITE_MAKE_OPENTYPE_TAG('f','i','n','2'),
DWRITE_MAKE_OPENTYPE_TAG('f','i','n','3'),
DWRITE_MAKE_OPENTYPE_TAG('m','e','d','i'),
DWRITE_MAKE_OPENTYPE_TAG('m','e','d','2'),
DWRITE_MAKE_OPENTYPE_TAG('i','n','i','t'),
}

Definition at line 23 of file arabic.c.

Referenced by arabic_collect_features(), arabic_setup_masks(), and feature_is_syriac().

◆ arabic_shaper

const struct shaper arabic_shaper
Initial value:
=
{
.collect_features = arabic_collect_features,
.setup_masks = arabic_setup_masks,
}
static void arabic_setup_masks(struct scriptshaping_context *context, const struct shaping_features *features)
Definition: arabic.c:143
static void arabic_collect_features(struct scriptshaping_context *context, struct shaping_features *features)
Definition: arabic.c:53

Definition at line 185 of file arabic.c.

Referenced by shape_set_shaper().

◆ arabic_shaping_table

const unsigned short arabic_shaping_table[]
extern

Definition at line 7 of file arabic_table.c.

Referenced by arabic_get_joining_type().

◆ arabic_state_table

const struct arabic_state_table_entry arabic_state_table[][JOINING_TYPES]
static
Initial value:
=
{
{ {NONE,NONE,0}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,6}, },
{ {NONE,NONE,0}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,2}, {NONE,FIN2,5}, {NONE,ISOL,6}, },
{ {NONE,NONE,0}, {NONE,ISOL,2}, {INIT,FINA,1}, {INIT,FINA,3}, {INIT,FINA,4}, {INIT,FINA,6}, },
{ {NONE,NONE,0}, {NONE,ISOL,2}, {MEDI,FINA,1}, {MEDI,FINA,3}, {MEDI,FINA,4}, {MEDI,FINA,6}, },
{ {NONE,NONE,0}, {NONE,ISOL,2}, {MED2,ISOL,1}, {MED2,ISOL,2}, {MED2,FIN2,5}, {MED2,ISOL,6}, },
{ {NONE,NONE,0}, {NONE,ISOL,2}, {ISOL,ISOL,1}, {ISOL,ISOL,2}, {ISOL,FIN2,5}, {ISOL,ISOL,6}, },
{ {NONE,NONE,0}, {NONE,ISOL,2}, {NONE,ISOL,1}, {NONE,ISOL,2}, {NONE,FIN3,5}, {NONE,ISOL,6}, }
}

Referenced by arabic_setup_masks().