* and filtering characters and bi-directional text with custom line breaks.
*/
-#include <stdarg.h>
-//#include <stdlib.h>
+#include "usp10_internal.h"
-#include <windef.h>
-//#include "winbase.h"
-#include <wingdi.h>
#include <winuser.h>
-//#include "winnls.h"
#include <winreg.h>
-#include <usp10.h>
-
-#include "usp10_internal.h"
-
-#include <wine/debug.h>
-#include <wine/unicode.h>
WINE_DEFAULT_DEBUG_CHANNEL(uniscribe);
if (str[index] == 0xc || str[index] == 0x20 || str[index] == 0x202f)
return Script_CR;
- /* These punctuation are separated out as Latin punctuation */
+ /* These punctuation characters are separated out as Latin punctuation */
if (strchrW(latin_punc,str[index]))
return Script_Punctuation2;
if (psc && *psc)
{
unsigned int i;
+ INT n;
for (i = 0; i < GLYPH_MAX / GLYPH_BLOCK_SIZE; i++)
{
heap_free(((ScriptCache *)*psc)->widths[i]);
}
for (i = 0; i < 0x10; i++)
{
- int j;
+ unsigned int j;
if (((ScriptCache *)*psc)->page[i])
for (j = 0; j < GLYPH_MAX / GLYPH_BLOCK_SIZE; j++)
heap_free(((ScriptCache *)*psc)->page[i]->glyphs[j]);
heap_free(((ScriptCache *)*psc)->GDEF_Table);
heap_free(((ScriptCache *)*psc)->CMAP_Table);
heap_free(((ScriptCache *)*psc)->GPOS_Table);
- for (i = 0; i < ((ScriptCache *)*psc)->script_count; i++)
+ for (n = 0; n < ((ScriptCache *)*psc)->script_count; n++)
{
int j;
- for (j = 0; j < ((ScriptCache *)*psc)->scripts[i].language_count; j++)
+ for (j = 0; j < ((ScriptCache *)*psc)->scripts[n].language_count; j++)
{
int k;
- for (k = 0; k < ((ScriptCache *)*psc)->scripts[i].languages[j].feature_count; k++)
- heap_free(((ScriptCache *)*psc)->scripts[i].languages[j].features[k].lookups);
- heap_free(((ScriptCache *)*psc)->scripts[i].languages[j].features);
+ for (k = 0; k < ((ScriptCache *)*psc)->scripts[n].languages[j].feature_count; k++)
+ heap_free(((ScriptCache *)*psc)->scripts[n].languages[j].features[k].lookups);
+ heap_free(((ScriptCache *)*psc)->scripts[n].languages[j].features);
}
- for (j = 0; j < ((ScriptCache *)*psc)->scripts[i].default_language.feature_count; j++)
- heap_free(((ScriptCache *)*psc)->scripts[i].default_language.features[j].lookups);
- heap_free(((ScriptCache *)*psc)->scripts[i].default_language.features);
- heap_free(((ScriptCache *)*psc)->scripts[i].languages);
+ for (j = 0; j < ((ScriptCache *)*psc)->scripts[n].default_language.feature_count; j++)
+ heap_free(((ScriptCache *)*psc)->scripts[n].default_language.features[j].lookups);
+ heap_free(((ScriptCache *)*psc)->scripts[n].default_language.features);
+ heap_free(((ScriptCache *)*psc)->scripts[n].languages);
}
heap_free(((ScriptCache *)*psc)->scripts);
heap_free(((ScriptCache *)*psc)->otm);
WORD layoutRTL = 0;
BOOL forceLevels = FALSE;
INT consumed = 0;
+ HRESULT res = E_OUTOFMEMORY;
TRACE("%s,%d,%d,%p,%p,%p,%p\n", debugstr_wn(pwcInChars, cInChars), cInChars, cMaxItems,
psControl, psState, pItems, pcItems);
if (original == Script_Punctuation2)
break;
}
- if (scriptInformation[scripts[j]].props.fComplex || asian)
+ if (j >= 0 && (scriptInformation[scripts[j]].props.fComplex || asian))
scripts[i] = scripts[j];
}
}
{
levels = heap_alloc_zero(cInChars * sizeof(WORD));
if (!levels)
- {
- heap_free(scripts);
- return E_OUTOFMEMORY;
- }
+ goto nomemory;
BIDI_DetermineLevels(pwcInChars, cInChars, psState, psControl, levels);
baselevel = levels[0];
else
{
BOOL inNumber = FALSE;
- static WCHAR math_punc[] = {'#','$','%','+',',','-','.','/',':',0x2212, 0x2044, 0x00a0,0};
+ static const WCHAR math_punc[] = {'#','$','%','+',',','-','.','/',':',0x2212, 0x2044, 0x00a0,0};
strength = heap_alloc_zero(cInChars * sizeof(WORD));
if (!strength)
- {
- heap_free(scripts);
- heap_free(levels);
- return E_OUTOFMEMORY;
- }
+ goto nomemory;
BIDI_GetStrengths(pwcInChars, cInChars, psControl, strength);
/* We currently mis-level leading Diacriticals */
index++;
if (index+1 > cMaxItems)
- return E_OUTOFMEMORY;
+ goto nomemory;
if (strength)
str = strength[cnt];
* item is set up to prevent random behaviour if the caller erroneously
* checks the n+1 structure */
index++;
+ if (index + 1 > cMaxItems) goto nomemory;
memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS));
TRACE("index=%d cnt=%d iCharPos=%d\n", index, cnt, pItems[index].iCharPos);
/* Set one SCRIPT_STATE item being returned */
- if (index + 1 > cMaxItems) return E_OUTOFMEMORY;
if (pcItems) *pcItems = index;
/* Set SCRIPT_ITEM */
pItems[index].iCharPos = cnt; /* the last item contains the ptr to the lastchar */
+ res = S_OK;
+nomemory:
heap_free(levels);
heap_free(strength);
heap_free(scripts);
- return S_OK;
+ return res;
}
/***********************************************************************
if (check >= cChars && !iMaxPos)
{
- for (check = clust; check < cChars; check++)
- special_size += get_glyph_cluster_advance(piAdvance, psva, pwLogClust, cGlyphs, cChars, check, 1);
+ int glyph;
+ for (glyph = clust; glyph < cGlyphs; glyph++)
+ special_size += get_glyph_cluster_advance(piAdvance, psva, pwLogClust, cGlyphs, cChars, glyph, 1);
iSpecial = item;
special_size /= (cChars - item);
iPosX += special_size;
if (check >= cChars && direction > 0)
{
- for (check = clust; check < cChars; check++)
- special_size += get_glyph_cluster_advance(piAdvance, psva, pwLogClust, cGlyphs, cChars, check, direction);
+ int glyph;
+ for (glyph = clust; glyph < cGlyphs; glyph++)
+ special_size += get_glyph_cluster_advance(piAdvance, psva, pwLogClust, cGlyphs, cChars, glyph, direction);
iSpecial = item;
special_size /= (cChars - item);
iPosX += special_size;
SCRIPT_GLYPHPROP *pOutGlyphProps, int *pcGlyphs)
{
HRESULT hr;
- unsigned int i,g;
+ int i;
+ unsigned int g;
BOOL rtl;
int cluster;
+ static int once = 0;
TRACE("(%p, %p, %p, %s, %s, %p, %p, %d, %s, %d, %d, %p, %p, %p, %p, %p )\n",
hdc, psc, psa,
if (cChars > cMaxGlyphs) return E_OUTOFMEMORY;
if (cRanges)
- FIXME("Ranges not supported yet\n");
+ if(!once++) FIXME("Ranges not supported yet\n");
rtl = (psa && !psa->fLogicalOrder && psa->fRTL);
{
HRESULT hr;
int i;
+ static int once = 0;
TRACE("(%p, %p, %p, %s, %s, %p, %p, %d, %s, %p, %p, %d, %p, %p, %d, %p %p %p)\n",
hdc, psc, psa,
if (!pGoffset) return E_FAIL;
if (cRanges)
- FIXME("Ranges not supported yet\n");
+ if (!once++) FIXME("Ranges not supported yet\n");
((ScriptCache *)*psc)->userScript = tagScript;
((ScriptCache *)*psc)->userLang = tagLangSys;
return SHAPE_GetFontFeatureTags(hdc, (ScriptCache *)*psc, psa, tagScript, tagLangSys, cMaxTags, pFeatureTags, pcTags);
}
+#ifdef __REACTOS__
BOOL gbLpkPresent = FALSE;
VOID WINAPI LpkPresent()
{
gbLpkPresent = TRUE; /* Turn it on this way! Wine is out of control! */
}
+#endif