Mercurial > hg > dmlib
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", |