Graphviz 13.0.0~dev.20250424.1043
Loading...
Searching...
No Matches
gvtextlayout_quartz.c
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (c) 2011 AT&T Intellectual Property
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#include "config.h"
12
13#include <stdbool.h>
14#include <stdlib.h>
15#include <string.h>
16#include <TargetConditionals.h>
17
19#include "gvplugin_quartz.h"
20
21#if TARGET_OS_IPHONE
22#include <CoreText/CoreText.h>
23#endif
24
25void *quartz_new_layout(char* fontname, double fontsize, char* text)
26{
27 CFStringRef fontnameref = CFStringCreateWithBytes(kCFAllocatorDefault, (const UInt8 *)fontname, strlen(fontname), kCFStringEncodingUTF8, FALSE);
28 CFStringRef textref = CFStringCreateWithBytes(kCFAllocatorDefault, (const UInt8 *)text, strlen(text), kCFStringEncodingUTF8, FALSE);
29 CTLineRef line = NULL;
30
31 if (fontnameref && textref) {
32 /* set up the Core Text line */
33 CTFontRef font = CTFontCreateWithName(fontnameref, fontsize, NULL);
34 CFTypeRef attributeNames[] = { kCTFontAttributeName, kCTForegroundColorFromContextAttributeName };
35 CFTypeRef attributeValues[] = { font, kCFBooleanTrue };
36 CFDictionaryRef attributes = CFDictionaryCreate(
37 kCFAllocatorDefault,
38 (const void**)attributeNames,
39 (const void**)attributeValues,
40 2,
41 &kCFTypeDictionaryKeyCallBacks,
42 &kCFTypeDictionaryValueCallBacks);
43 CFAttributedStringRef attributed = CFAttributedStringCreate(kCFAllocatorDefault, textref, attributes);
44 line = CTLineCreateWithAttributedString(attributed);
45
46 CFRelease(attributed);
47 CFRelease(attributes);
48 CFRelease(font);
49 }
50
51 if (textref)
52 CFRelease(textref);
53 if (fontnameref)
54 CFRelease(fontnameref);
55 return (void *)line;
56}
57
58void quartz_size_layout(void *layout, double* width, double* height, double* yoffset_layout)
59{
60 /* get the typographic bounds */
61 CGFloat ascent = 0.0;
62 CGFloat descent = 0.0;
63 CGFloat leading = 0.0;
64
65 *width = CTLineGetTypographicBounds(layout, &ascent, &descent, &leading);
66 *height = ascent + descent + leading;
67 *yoffset_layout = ascent;
68}
69
70void quartz_draw_layout(void *layout, CGContextRef context, CGPoint position)
71{
72 CGContextSetTextPosition(context, position.x, position.y);
73 CTLineDraw(layout, context);
74}
75
77{
78 if (layout)
79 CFRelease(layout);
80}
81
82static bool quartz_textlayout(textspan_t *para, char **fontpath)
83{
84 (void)fontpath;
85
86 void *line = quartz_new_layout(para->font->name, para->font->size, para->str);
87 if (line)
88 {
89 /* report the layout */
90 para->layout = line;
92 quartz_size_layout(line, &para->size.x, &para->size.y, &para->yoffset_layout);
93 para->yoffset_centerline = 0.2 * para->font->size;
94 return true;
95 }
96 else
97 return false;
98};
99
103
105 {0, "textlayout", 8, &quartz_textlayout_engine, NULL},
106 {0, NULL, 0, NULL, NULL}
107};
node NULL
Definition grammar.y:163
void quartz_draw_layout(void *layout, CGContextRef context, CGPoint position)
void * quartz_new_layout(char *fontname, double fontsize, char *text)
static gvtextlayout_engine_t quartz_textlayout_engine
void quartz_size_layout(void *layout, double *width, double *height, double *yoffset_layout)
gvplugin_installed_t gvtextlayout_quartz_types[]
void quartz_free_layout(void *layout)
static bool quartz_textlayout(textspan_t *para, char **fontpath)
$2 font
Definition htmlparse.y:300
static int layout(graph_t *g, layout_info *infop)
Definition layout.c:814
ingroup plugin_api
Definition gvplugin.h:35
double x
Definition geom.h:29
double y
Definition geom.h:29
float x
Definition simple.h:22
float y
Definition simple.h:22
char * name
Definition textspan.h:54
double size
Definition textspan.h:57
double yoffset_layout
Definition textspan.h:69
char * str
Definition textspan.h:65
void * layout
Definition textspan.h:67
pointf size
Definition textspan.h:70
textfont_t * font
Definition textspan.h:66
double yoffset_centerline
Definition textspan.h:69
void(* free_layout)(void *layout)
Definition textspan.h:68