@@ -139,8 +139,9 @@ public MeshMesh resolveMesh() {
139
139
var fontInfo = FontManager . instance . getOrCreate ( style . fontFamily , style . fontWeight , style . fontStyle ) ;
140
140
var font = fontInfo . font ;
141
141
142
- if ( char . IsHighSurrogate ( text [ this . textBlob . textOffset ] ) ) {
143
- D . assert ( this . textBlob . textSize % 2 == 0 ) ;
142
+ // Handling Emoji
143
+ char startingChar = text [ this . textBlob . textOffset ] ;
144
+ if ( char . IsHighSurrogate ( startingChar ) || EmojiUtils . isSingleCharEmoji ( startingChar ) ) {
144
145
var vert = new List < Vector3 > ( ) ;
145
146
var tri = new List < int > ( ) ;
146
147
var uvCoord = new List < Vector2 > ( ) ;
@@ -151,29 +152,40 @@ public MeshMesh resolveMesh() {
151
152
var minY = minMaxRect . top ;
152
153
var maxY = minMaxRect . bottom ;
153
154
154
- for ( int i = 0 ; i < this . textBlob . textSize ; i += 2 ) {
155
- char a = text [ this . textBlob . textOffset + i ] , b = text [ this . textBlob . textOffset + i + 1 ] ;
156
- D . assert ( char . IsLowSurrogate ( b ) ) ;
155
+ for ( int i = 0 ; i < this . textBlob . textSize ; i ++ ) {
156
+ char a = text [ this . textBlob . textOffset + i ] ;
157
+ int code = a ;
158
+ if ( char . IsHighSurrogate ( a ) ) {
159
+ D . assert ( i + 1 < this . textBlob . textSize ) ;
160
+ D . assert ( this . textBlob . textOffset + i + 1 < this . textBlob . text . Length ) ;
161
+ char b = text [ this . textBlob . textOffset + i + 1 ] ;
162
+ D . assert ( char . IsLowSurrogate ( b ) ) ;
163
+ code = char . ConvertToUtf32 ( a , b ) ;
164
+ } else if ( char . IsLowSurrogate ( a ) || EmojiUtils . isEmptyEmoji ( a ) ) {
165
+ continue ;
166
+ }
167
+ var uvRect = EmojiUtils . getUVRect ( code ) ;
157
168
158
169
var pos = this . textBlob . positions [ i ] ;
159
-
170
+
171
+ int baseIndex = vert . Count ;
160
172
vert . Add ( new Vector3 ( pos . x + minX , pos . y + minY , 0 ) ) ;
161
173
vert . Add ( new Vector3 ( pos . x + maxX , pos . y + minY , 0 ) ) ;
162
174
vert . Add ( new Vector3 ( pos . x + maxX , pos . y + maxY , 0 ) ) ;
163
175
vert . Add ( new Vector3 ( pos . x + minX , pos . y + maxY , 0 ) ) ;
164
176
165
- tri . Add ( i * 2 ) ;
166
- tri . Add ( i * 2 + 1 ) ;
167
- tri . Add ( i * 2 + 2 ) ;
168
- tri . Add ( i * 2 ) ;
169
- tri . Add ( i * 2 + 2 ) ;
170
- tri . Add ( i * 2 + 3 ) ;
171
- var code = char . ConvertToUtf32 ( a , b ) ;
172
- var uvRect = EmojiUtils . getUVRect ( code ) ;
177
+ tri . Add ( baseIndex ) ;
178
+ tri . Add ( baseIndex + 1 ) ;
179
+ tri . Add ( baseIndex + 2 ) ;
180
+ tri . Add ( baseIndex ) ;
181
+ tri . Add ( baseIndex + 2 ) ;
182
+ tri . Add ( baseIndex + 3 ) ;
173
183
uvCoord . Add ( uvRect . bottomLeft . toVector ( ) ) ;
174
184
uvCoord . Add ( uvRect . bottomRight . toVector ( ) ) ;
175
185
uvCoord . Add ( uvRect . topRight . toVector ( ) ) ;
176
186
uvCoord . Add ( uvRect . topLeft . toVector ( ) ) ;
187
+
188
+ if ( char . IsHighSurrogate ( a ) ) i ++ ;
177
189
}
178
190
MeshMesh meshMesh = new MeshMesh ( null , vert , tri , uvCoord ) ;
179
191
_meshes [ key ] = new MeshInfo ( key , meshMesh , 0 ) ;
0 commit comments