comparison src/libgfx.c @ 902:c6c480e8e1c8

Add separate X and Y scaling to gfxconv and libgfx outputters.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 23 Feb 2015 20:45:31 +0200
parents e7019bd83cca
children ebe0d93e03c0
comparison
equal deleted inserted replaced
901:f532262f90b1 902:c6c480e8e1c8
132 { 132 {
133 int x, y, yscale, xscale, res = 0, rowSize, rowWidth; 133 int x, y, yscale, xscale, res = 0, rowSize, rowWidth;
134 Uint8 *row = NULL; 134 Uint8 *row = NULL;
135 135
136 // Allocate memory for row buffer 136 // Allocate memory for row buffer
137 rowWidth = img->width * spec->scale; 137 rowWidth = img->width * spec->scaleX;
138 rowSize = rowWidth * dmImageGetBytesPerPixel(spec->format); 138 rowSize = rowWidth * dmImageGetBytesPerPixel(spec->format);
139 139
140 if ((row = dmMalloc(rowSize + 16)) == NULL) 140 if ((row = dmMalloc(rowSize + 16)) == NULL)
141 { 141 {
142 res = DMERR_MALLOC; 142 res = DMERR_MALLOC;
154 { 154 {
155 Uint8 c = img->data[(y * img->pitch) + x], qr, qg, qb, qa; 155 Uint8 c = img->data[(y * img->pitch) + x], qr, qg, qb, qa;
156 switch (spec->format) 156 switch (spec->format)
157 { 157 {
158 case DM_IFMT_PALETTE: 158 case DM_IFMT_PALETTE:
159 for (xscale = 0; xscale < spec->scale; xscale++) 159 for (xscale = 0; xscale < spec->scaleX; xscale++)
160 *ptr1++ = c; 160 *ptr1++ = c;
161 break; 161 break;
162 162
163 case DM_IFMT_RGBA: 163 case DM_IFMT_RGBA:
164 qr = img->pal[c].r; 164 qr = img->pal[c].r;
165 qg = img->pal[c].g; 165 qg = img->pal[c].g;
166 qb = img->pal[c].b; 166 qb = img->pal[c].b;
167 qa = img->pal[c].a; 167 qa = img->pal[c].a;
168 168
169 for (xscale = 0; xscale < spec->scale; xscale++) 169 for (xscale = 0; xscale < spec->scaleX; xscale++)
170 { 170 {
171 *ptr1++ = qr; 171 *ptr1++ = qr;
172 *ptr1++ = qg; 172 *ptr1++ = qg;
173 *ptr1++ = qb; 173 *ptr1++ = qb;
174 *ptr1++ = qa; 174 *ptr1++ = qa;
178 case DM_IFMT_RGB: 178 case DM_IFMT_RGB:
179 qr = img->pal[c].r; 179 qr = img->pal[c].r;
180 qg = img->pal[c].g; 180 qg = img->pal[c].g;
181 qb = img->pal[c].b; 181 qb = img->pal[c].b;
182 182
183 for (xscale = 0; xscale < spec->scale; xscale++) 183 for (xscale = 0; xscale < spec->scaleX; xscale++)
184 { 184 {
185 *ptr1++ = qr; 185 *ptr1++ = qr;
186 *ptr1++ = qg; 186 *ptr1++ = qg;
187 *ptr1++ = qb; 187 *ptr1++ = qb;
188 } 188 }
191 case DM_IFMT_RGB_PLANE: 191 case DM_IFMT_RGB_PLANE:
192 qr = img->pal[c].r; 192 qr = img->pal[c].r;
193 qg = img->pal[c].g; 193 qg = img->pal[c].g;
194 qb = img->pal[c].b; 194 qb = img->pal[c].b;
195 195
196 for (xscale = 0; xscale < spec->scale; xscale++) 196 for (xscale = 0; xscale < spec->scaleX; xscale++)
197 { 197 {
198 *ptr1++ = qr; 198 *ptr1++ = qr;
199 *ptr2++ = qg; 199 *ptr2++ = qg;
200 *ptr3++ = qb; 200 *ptr3++ = qb;
201 } 201 }
202 break; 202 break;
203 } 203 }
204 } 204 }
205 205
206 for (yscale = 0; yscale < spec->scale; yscale++) 206 for (yscale = 0; yscale < spec->scaleY; yscale++)
207 { 207 {
208 if ((res = writeRowCB(cbdata, row, rowSize)) != DMERR_OK) 208 if ((res = writeRowCB(cbdata, row, rowSize)) != DMERR_OK)
209 goto done; 209 goto done;
210 } 210 }
211 } 211 }
320 int dmWritePPMImageFILE(FILE *fp, DMImage *img, DMImageSpec *spec) 320 int dmWritePPMImageFILE(FILE *fp, DMImage *img, DMImageSpec *spec)
321 { 321 {
322 // Write PPM header 322 // Write PPM header
323 fprintf(fp, 323 fprintf(fp,
324 "P6\n%d %d\n255\n", 324 "P6\n%d %d\n255\n",
325 img->width * spec->scale, 325 img->width * spec->scaleX,
326 img->height * spec->scale); 326 img->height * spec->scaleY);
327 327
328 // Write image data 328 // Write image data
329 spec->format = DM_IFMT_RGB; 329 spec->format = DM_IFMT_RGB;
330 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, spec); 330 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, spec);
331 } 331 }
411 res = DMERR_NOT_SUPPORTED; 411 res = DMERR_NOT_SUPPORTED;
412 goto error; 412 goto error;
413 } 413 }
414 414
415 png_set_IHDR(png_ptr, info_ptr, 415 png_set_IHDR(png_ptr, info_ptr,
416 img->width * spec->scale, 416 img->width * spec->scaleX,
417 img->height * spec->scale, 417 img->height * spec->scaleY,
418 8, /* bits per component */ 418 8, /* bits per component */
419 fmt, 419 fmt,
420 PNG_INTERLACE_NONE, 420 PNG_INTERLACE_NONE,
421 PNG_COMPRESSION_TYPE_DEFAULT, 421 PNG_COMPRESSION_TYPE_DEFAULT,
422 PNG_FILTER_TYPE_DEFAULT); 422 PNG_FILTER_TYPE_DEFAULT);
423 423
424 dmMsg(3, "PNG: %d x %d, depth=%d, type=%d\n", 424 dmMsg(3, "PNG: %d x %d, depth=%d, type=%d\n",
425 img->width * spec->scale, 425 img->width * spec->scaleX,
426 img->height * spec->scale, 426 img->height * spec->scaleY,
427 8, fmt); 427 8, fmt);
428 428
429 // Palette 429 // Palette
430 if (spec->format == DM_IFMT_PALETTE) 430 if (spec->format == DM_IFMT_PALETTE)
431 { 431 {
818 } 818 }
819 hdr.manufacturer = 10; 819 hdr.manufacturer = 10;
820 hdr.version = 5; 820 hdr.version = 5;
821 hdr.encoding = 1; 821 hdr.encoding = 1;
822 hdr.bpp = 8; 822 hdr.bpp = 8;
823 hdr.hres = img->width * spec->scale; 823 hdr.hres = img->width * spec->scaleX;
824 hdr.vres = img->height * spec->scale; 824 hdr.vres = img->height * spec->scaleY;
825 hdr.xmin = hdr.ymin = 0; 825 hdr.xmin = hdr.ymin = 0;
826 hdr.xmax = hdr.hres - 1; 826 hdr.xmax = hdr.hres - 1;
827 hdr.ymax = hdr.vres - 1; 827 hdr.ymax = hdr.vres - 1;
828 hdr.nplanes = dmImageGetBytesPerPixel(pcx.format); 828 hdr.nplanes = dmImageGetBytesPerPixel(pcx.format);
829 hdr.palinfo = 1; 829 hdr.palinfo = 1;
830 830
831 res = (img->width * spec->scale); 831 res = (img->width * spec->scaleX);
832 hdr.bpl = res / 2; 832 hdr.bpl = res / 2;
833 if (res % 2) hdr.bpl++; 833 if (res % 2) hdr.bpl++;
834 hdr.bpl *= 2; 834 hdr.bpl *= 2;
835 835
836 dmMsg(3, "PCX: paletted=%d, nplanes=%d, bpp=%d, bpl=%d\n", 836 dmMsg(3, "PCX: paletted=%d, nplanes=%d, bpp=%d, bpl=%d\n",