47 CGContextRef context = job->
context;
51 size_t context_datalen;
61 context_data = CGBitmapContextGetData(context);
62 context_datalen = CGBitmapContextGetBytesPerRow(context) * CGBitmapContextGetHeight(context);
71 CGPDFContextClose(context);
76 *((CGImageRef *) job->
window) = CGBitmapContextCreateImage(context);
82 CGDataConsumerRef data_consumer =
83 CGDataConsumerCreate(job,
85 CGImageDestinationRef image_destination =
86 CGImageDestinationCreateWithDataConsumer(data_consumer,
90 CGImageRef
image = CGBitmapContextCreateImage(context);
91 CGImageDestinationAddImage(image_destination,
image,
NULL);
92 CGImageDestinationFinalize(image_destination);
95 if (image_destination)
96 CFRelease(image_destination);
97 CGImageRelease(
image);
98 CGDataConsumerRelease(data_consumer);
103 CGContextRelease(context);
106 if (context_data && context_datalen)
107 munmap(context_data, context_datalen);
113 CGRect bounds = CGRectMake(0.0, 0.0, job->
width, job->
height);
122 CFStringRef auxiliaryKeys[] = {
123 kCGPDFContextCreator,
126 CFStringRef auxiliaryValues[] = {
127 CFStringCreateWithFormat(kCFAllocatorDefault,
NULL,
133 CFStringCreateWithBytesNoCopy(kCFAllocatorDefault,
136 kCFStringEncodingUTF8,
141 CFDictionaryRef auxiliaryInfo =
142 CFDictionaryCreate(kCFAllocatorDefault,
143 (
const void **) &auxiliaryKeys,
144 (
const void **) &auxiliaryValues,
145 sizeof(auxiliaryValues) /
146 sizeof(auxiliaryValues[0]),
147 &kCFTypeDictionaryKeyCallBacks,
148 &kCFTypeDictionaryValueCallBacks);
151 CGDataConsumerRef data_consumer =
152 CGDataConsumerCreate(job,
155 CGPDFContextCreate(data_consumer, &bounds,
159 CGDataConsumerRelease(data_consumer);
160 CFRelease(auxiliaryInfo);
161 for (
size_t i = 0; i <
sizeof(auxiliaryValues) /
sizeof(auxiliaryValues[0]);
163 CFRelease(auxiliaryValues[i]);
169 size_t bytes_per_row =
178 size_t buffer_size = job->
height * bytes_per_row;
179 mach_msg_type_number_t vm_info_size = HOST_VM_INFO_COUNT;
180 vm_statistics_data_t vm_info;
183 (mach_host_self(), HOST_VM_INFO,
184 (host_info_t) & vm_info,
185 &vm_info_size) != KERN_SUCCESS
187 vm_info.free_count * vm_page_size) {
188 FILE *temp_file = tmpfile();
190 int temp_file_descriptor = fileno(temp_file);
191 if (temp_file_descriptor >= 0
192 && ftruncate(temp_file_descriptor,
194 buffer = mmap(
NULL, buffer_size, PROT_READ | PROT_WRITE,
195 MAP_FILE | MAP_PRIVATE, temp_file_descriptor, 0);
196 if (buffer == MAP_FAILED)
202 if (buffer ==
NULL) {
203 buffer = mmap(
NULL, buffer_size, PROT_READ | PROT_WRITE,
204 MAP_ANON | MAP_PRIVATE, -1, 0);
205 if (buffer == MAP_FAILED) {
212 CGColorSpaceRef color_space =
213 CGColorSpaceCreateDeviceRGB();
214 job->
context = CGBitmapContextCreate(buffer,
220 kCGImageAlphaPremultipliedFirst
225 CGColorSpaceRelease(color_space);
233 CGContextRef context = job->
context;
234 CGContextBeginPage(context, &bounds);
235 CGContextSaveGState(context);
241 CGContextRotateCTM(context, job->
rotation *
M_PI / 180.0);
254 char *target,
char *
id)
261 if (url && url_map) {
263 CGContextRef context = job->
context;
265 CFURLCreateWithBytes(kCFAllocatorDefault, (
const UInt8 *) url,
266 strlen(url), kCFStringEncodingUTF8,
NULL);
267 CGPDFContextSetURLForRect(context, uri,
269 CGRectApplyAffineTransform(CGRectMake
290 CGContextRef context = job->
context;
304 const CGFloat *segments;
305 size_t segment_count;
309 segment_count =
sizeof(
dashed) /
sizeof(CGFloat);
313 segment_count =
sizeof(
dotted) /
sizeof(CGFloat);
320 CGContextSetLineDash(context, 0.0, segments, segment_count);
323 CGContextSetLineWidth(context, job->
obj->
penwidth);
326 CGContextDrawPath(context, filled ? kCGPathFillStroke : kCGPathStroke);
double yoffset_centerline
void(* free_layout)(void *layout)