#if defined(MAGICKCORE_FREETYPE_DELEGATE)
-static size_t ComplexTextLayout(const char *text,const size_t length,
- const FT_Face face,const raqm_direction_t direction,const char *features,
+static size_t ComplexTextLayout(const Image *image,const char *text,
+ const size_t length,const FT_Face face,const raqm_direction_t direction,
const FT_Int32 flags,GraphemeInfo **grapheme)
{
#if defined(MAGICKCORE_RAQM_DELEGATE)
+ const char
+ *features;
+
int
i;
raqm_glyph_t
*glyphs;
- count = 0;
- rq = raqm_create();
+ count=0;
+ rq=raqm_create();
if (rq == (raqm_t *) NULL)
goto cleanup;
-
- if (!raqm_set_text_utf8(rq,text,length))
+ if (raqm_set_text_utf8(rq,text,length) == 0)
goto cleanup;
-
- if (!raqm_set_par_direction(rq,direction))
+ if (raqm_set_par_direction(rq,direction) == 0)
goto cleanup;
-
- if (!raqm_set_freetype_face(rq,face))
+ if (raqm_set_freetype_face(rq,face) == 0)
goto cleanup;
-
- if (features)
+ features=GetImageProperty(image,"type:features",exception);
+ if (features != (const char *) NULL)
{
char
breaker,
next=0;
token_info=AcquireTokenInfo();
token=(char *) AcquireQuantumMemory(50,sizeof(*token));
- status_token = Tokenizer(token_info,0,token,50,features,
- "",",","",'\0',&breaker,&next,"e);
+ status_token=Tokenizer(token_info,0,token,50,features,"",",","",'\0',
+ &breaker,&next,"e);
while (status_token == 0)
- {
- raqm_add_font_feature(rq, token, strlen(token));
- status_token = Tokenizer(token_info,0,token,50,features,
- "",",","",'\0',&breaker,&next,"e);
- }
+ {
+ raqm_add_font_feature(rq,token,strlen(token));
+ status_token=Tokenizer(token_info,0,token,50,features,"",",","",'\0',
+ &breaker,&next,"e);
+ }
token_info=DestroyTokenInfo(token_info);
token=DestroyString(token);
}
-
- if (!raqm_layout(rq))
+ if (raqm_layout(rq) == 0)
goto cleanup;
-
- glyphs = raqm_get_glyphs(rq,&count);
+ glyphs=raqm_get_glyphs(rq,&count);
if (glyphs == (raqm_glyph_t *) NULL)
{
- count = 0;
+ count=0;
goto cleanup;
}
-
*grapheme=(GraphemeInfo *) AcquireQuantumMemory(count,sizeof(**grapheme));
if (*grapheme == (GraphemeInfo *) NULL)
{
- count = 0;
+ count=0;
goto cleanup;
}
-
for (i = 0; i < count; i++)
- {
- (*grapheme)[i].index = glyphs[i].index;
- (*grapheme)[i].x_offset = glyphs[i].x_offset;
- (*grapheme)[i].x_advance = glyphs[i].x_advance;
- (*grapheme)[i].y_offset = glyphs[i].y_offset;
- (*grapheme)[i].cluster = glyphs[i].cluster;
- }
+ {
+ (*grapheme)[i].index=glyphs[i].index;
+ (*grapheme)[i].x_offset=glyphs[i].x_offset;
+ (*grapheme)[i].x_advance=glyphs[i].x_advance;
+ (*grapheme)[i].y_offset=glyphs[i].y_offset;
+ (*grapheme)[i].cluster=glyphs[i].cluster;
+ }
cleanup:
- raqm_destroy (rq);
-
+ raqm_destroy(rq);
return(count);
#else
FT_Error
/*
Simple layout for bi-directional text (right-to-left or left-to-right).
*/
- *grapheme=(GraphemeInfo *) AcquireQuantumMemory(length+1,
- sizeof(**grapheme));
+ *grapheme=(GraphemeInfo *) AcquireQuantumMemory(length+1,sizeof(**grapheme));
if (*grapheme == (GraphemeInfo *) NULL)
return(0);
last_glyph=0;
if (draw_info->direction == LeftToRightDirection)
direction=RAQM_DIRECTION_LTR;
grapheme=(GraphemeInfo *) NULL;
- length=ComplexTextLayout(p,strlen(p),face,direction,draw_info->font_features,flags,&grapheme);
+ length=ComplexTextLayout(image,p,strlen(p),face,direction,flags,&grapheme);
code=0;
for (i=0; i < (ssize_t) length; i++)
{
(void) CloneString(&clone_info->text,draw_info->text);
if (draw_info->font != (char *) NULL)
(void) CloneString(&clone_info->font,draw_info->font);
- if (draw_info->font_features != (char *) NULL)
- (void) CloneString(&clone_info->font_features,draw_info->font_features);
if (draw_info->metrics != (char *) NULL)
(void) CloneString(&clone_info->metrics,draw_info->metrics);
if (draw_info->family != (char *) NULL)
draw_info->stroke_pattern=DestroyImage(draw_info->stroke_pattern);
if (draw_info->font != (char *) NULL)
draw_info->font=DestroyString(draw_info->font);
- if (draw_info->font_features != (char *) NULL)
- draw_info->font_features=DestroyString(draw_info->font_features);
if (draw_info->metrics != (char *) NULL)
draw_info->metrics=DestroyString(draw_info->metrics);
if (draw_info->family != (char *) NULL)
(void) CloneString(&graphic_context[n]->family,token);
break;
}
- if (LocaleCompare("font-features",keyword) == 0)
- {
- GetMagickToken(q,&q,token);
- (void) CloneString(&graphic_context[n]->font_features,token);
- if (LocaleCompare("none",token) == 0)
- graphic_context[n]->font_features=(char *)
- RelinquishMagickMemory(graphic_context[n]->font_features);
- break;
- }
if (LocaleCompare("font-size",keyword) == 0)
{
GetMagickToken(q,&q,token);
draw_info->stroke_antialias=clone_info->antialias;
if (clone_info->font != (char *) NULL)
draw_info->font=AcquireString(clone_info->font);
- option=GetImageOption(clone_info,"font-features");
- if (option != (char *) NULL)
- draw_info->font_features=AcquireString(option);
if (clone_info->density != (char *) NULL)
draw_info->density=AcquireString(clone_info->density);
draw_info->text_antialias=clone_info->antialias;
{ "-flop", 0L, SimpleOperatorFlag, MagickFalse },
{ "+font", 0L, ImageInfoOptionFlag | DrawInfoOptionFlag, MagickFalse },
{ "-font", 1L, ImageInfoOptionFlag | DrawInfoOptionFlag, MagickFalse },
- { "+font-features", 0L, ImageInfoOptionFlag | DrawInfoOptionFlag, MagickFalse },
- { "-font-features", 1L, ImageInfoOptionFlag | DrawInfoOptionFlag, MagickFalse },
{ "+foreground", 0L, NonMagickOptionFlag, MagickFalse },
{ "-foreground", 1L, NonMagickOptionFlag, MagickFalse },
{ "+frame", 1L, DeprecateOptionFlag, MagickTrue },