From 862cd438ed1613cfd2585faf0b70bfe4f176a335 Mon Sep 17 00:00:00 2001 From: Rasmus Andersson Date: Fri, 2 Aug 2019 08:53:21 -0700 Subject: [PATCH] tools: small updates to fontsample --- misc/tools/fontsample/fontsample | Bin 24500 -> 24360 bytes misc/tools/fontsample/fontsample.mm | 47 +++++++++++++++++++++------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/misc/tools/fontsample/fontsample b/misc/tools/fontsample/fontsample index d405bf5110fdbffdf946867784e677235bb2c5ad..cd33ad22faa52513fb1b39a9f57ebf9e7561eef4 100755 GIT binary patch literal 24360 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 literal 24500 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 csUQ9b Font size to render. Defaults to %g.\n" " -t, -text Text line to render. Defaults to \"%s\".\n" +" -width Make the image wide (automatic if not set)\n" +" -height Make the image tall (automatic if not set)\n" " -o Write output to instead of default filename.\n" " Defaults to .pdf. If the provided filename\n" " ends with \".png\" a PNG is written instead of a PDF.\n" @@ -71,14 +75,20 @@ void draw(CGContextRef ctx, CTLineRef textLine, CGFloat width, CGFloat height, - CGFloat descent) + CGFloat descent, + CGFloat textWidth, + CGFloat textHeight) { // white background - CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); - CGContextFillRect(ctx, {{0,0},{width,height}}); + // CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); + // CGContextFillRect(ctx, {{0,0},{width,height}}); + + // center text + CGFloat x = ceilf((width - textWidth) / 2); + CGFloat y = descent + ceilf((height - textHeight) / 2); // draw text - CGContextSetTextPosition(ctx, 0, descent); + CGContextSetTextPosition(ctx, x, y); CTLineDraw(textLine, ctx); } @@ -89,6 +99,7 @@ void makePDF(CTLineRef textLine, CGFloat descent, NSString* filename) { + // TODO: read and use options.width and options.height CFMutableDataRef consumerData = CFDataCreateMutable(kCFAllocatorDefault, 0); CGDataConsumerRef contextConsumer = CGDataConsumerCreateWithCFData(consumerData); assert(contextConsumer); @@ -97,7 +108,7 @@ void makePDF(CTLineRef textLine, assert(ctx); CGPDFContextBeginPage(ctx, nil); - draw(ctx, textLine, width, height, descent); + draw(ctx, textLine, width, height, descent, width, height); // CGContextDrawPDFPage(ctx, page); CGPDFContextEndPage(ctx); @@ -135,7 +146,13 @@ void makePNG(CTLineRef textLine, NSString* filename) { size_t widthz = (size_t)ceilf(width); - size_t heightz = (size_t)ceilf(height); + size_t heightz = (size_t)ceilf(height * 1.2); // 120% to make sure we don't clip + if (options.width > 0) { + widthz = options.width; + } + if (options.height > 0) { + heightz = options.height; + } void* data = malloc(widthz * heightz * 4); @@ -145,7 +162,7 @@ void makePNG(CTLineRef textLine, CGContextRef ctx = CGBitmapContextCreate(data, widthz, heightz, 8, widthz*4, space, bitmapInfo); CGColorSpaceRelease(space); - draw(ctx, textLine, (CGFloat)widthz, (CGFloat)heightz, descent); + draw(ctx, textLine, (CGFloat)widthz, (CGFloat)heightz, descent, width, height); CGImageRef imageRef = CGBitmapContextCreateImage(ctx); writePNG(imageRef, filename); @@ -157,8 +174,6 @@ void makePNG(CTLineRef textLine, void pdfmake(NSString* fontfile) { - NSString* text = @"Rags78 **A**"; - NSString* outfile = options.output; if (outfile == nil) { // default to fontfile.pdf @@ -168,7 +183,7 @@ void pdfmake(NSString* fontfile) { // Create an attributed string with string and font information CTFontRef font = loadFont(fontfile, options.size); - CTLineRef textLine = createTextLine(font, text); + CTLineRef textLine = createTextLine(font, options.text); if (!textLine) { fprintf(stderr, "%s: invalid sample text\n", prog); exit(1); @@ -177,7 +192,7 @@ void pdfmake(NSString* fontfile) { // get font metrics CGFloat ascent, descent, leading; CGFloat width = CTLineGetTypographicBounds(textLine, &ascent, &descent, &leading); - CGFloat height = ascent + descent; + CGFloat height = ascent + descent + leading; printf("write %s\n", outfile.UTF8String); if ([outfile.pathExtension.lowercaseString isEqualToString:@"png"]) { @@ -227,6 +242,16 @@ NSMutableArray* parseargs(int argc, const char * argv[]) { auto val = getargval(arg, i++, argc, argv); options.output = [NSString stringWithUTF8String:val]; + } else if (strcmp(arg, "-width") == 0) { + auto val = getargval(arg, i++, argc, argv); + char* endptr = NULL; + options.width = (size_t)strtoull((const char*)val, &endptr, 10); + + } else if (strcmp(arg, "-height") == 0) { + auto val = getargval(arg, i++, argc, argv); + char* endptr = NULL; + options.height = (size_t)strtoull((const char*)val, &endptr, 10); + } else if (strcmp(arg, "-z") == 0 || strcmp(arg, "-size") == 0) { auto val = getargval(arg, i++, argc, argv); auto f = atof(val);