libansilove

Library for converting ANSI, ASCII, and other formats to PNG
Log | Files | Refs | README | LICENSE

output.c (1637B)


      1 /*
      2  * output.c
      3  * libansilove 1.2.7
      4  * https://www.ansilove.org
      5  *
      6  * Copyright (c) 2011-2020 Stefan Vogt, Brian Cassidy, and Frederic Cambus
      7  * All rights reserved.
      8  *
      9  * libansilove is licensed under the BSD 2-Clause License.
     10  * See LICENSE file for details.
     11  */
     12 
     13 #include <gd.h>
     14 #include "ansilove.h"
     15 #include "output.h"
     16 
     17 int
     18 output(struct ansilove_ctx *ctx, struct ansilove_options *options,
     19     gdImagePtr source)
     20 {
     21 	/* Handle DOS aspect ratio */
     22 	if (options->dos) {
     23 		gdImagePtr dos = gdImageCreateTrueColor(source->sx,
     24 		    source->sy * 1.35);
     25 
     26 		if (!dos) {
     27 			ctx->error = ANSILOVE_GD_ERROR;
     28 			return -1;
     29 		}
     30 
     31 		gdImageCopyResampled(dos, source, 0, 0, 0, 0,
     32 		    dos->sx, dos->sy, source->sx, source->sy);
     33 
     34 		gdImageDestroy(source);
     35 		source = dos;
     36 	}
     37 
     38 	/* Handle resizing */
     39 	if (options->scale_factor) {
     40 		if (options->scale_factor < 2 || options->scale_factor > 8) {
     41 			ctx->error = ANSILOVE_RANGE_ERROR;
     42 			return -1;
     43 		}
     44 
     45 		uint32_t width, height;
     46 		gdImagePtr retina;
     47 
     48 		width = source->sx * options->scale_factor;
     49 		height = source->sy * options->scale_factor;
     50 
     51 		retina = gdImageTrueColor(source) ?
     52 			gdImageCreateTrueColor(width, height) :
     53 			gdImageCreate(width, height);
     54 
     55 		if (!retina) {
     56 			ctx->error = ANSILOVE_GD_ERROR;
     57 			return -1;
     58 		}
     59 
     60 		gdImageCopyResized(retina, source, 0, 0, 0, 0,
     61 		    retina->sx, retina->sy, source->sx, source->sy);
     62 
     63 		gdImageDestroy(source);
     64 		source = retina;
     65 	}
     66 
     67 	/* Handle transparency */
     68 	if (options->mode == ANSILOVE_MODE_TRANSPARENT)
     69 		gdImageColorTransparent(source, 0);
     70 
     71 	ctx->png.buffer = gdImagePngPtr(source, &ctx->png.length);
     72 
     73 	gdImageDestroy(source);
     74 
     75 	return 0;
     76 }