Difference between revisions of "Targa.c"
(change colours and sizes) |
m (comments) |
||
Line 19: | Line 19: | ||
} | } | ||
+ | // Return complete byte size of passed image | ||
int getSize(unsigned char* image) { | int getSize(unsigned char* image) { | ||
int width = (image[13]<<8)+image[12]; | int width = (image[13]<<8)+image[12]; | ||
Line 25: | Line 26: | ||
} | } | ||
+ | // Return address of pixel x,y in passed image | ||
char* getOffset(unsigned char* image, int x, int y) { | char* getOffset(unsigned char* image, int x, int y) { | ||
int width = (image[13]<<8)+image[12]; | int width = (image[13]<<8)+image[12]; | ||
Line 30: | Line 32: | ||
} | } | ||
+ | // Return the content of pixel x,y for the passed image | ||
int getPixel(char* image, int x, int y) { | int getPixel(char* image, int x, int y) { | ||
return *getOffset(image,x,y); | return *getOffset(image,x,y); | ||
} | } | ||
− | // Set pixel | + | // Set pixel x,y to passed colour allowing for alpha |
void setPixel(char* image, int x, int y, int colour) { | void setPixel(char* image, int x, int y, int colour) { | ||
int i, col[3], a = colour >> 24; | int i, col[3], a = colour >> 24; | ||
Line 41: | Line 44: | ||
col[2] = colour & 0xff; | col[2] = colour & 0xff; | ||
unsigned char* pix = getOffset(image,x,y); | unsigned char* pix = getOffset(image,x,y); | ||
− | for (i=0; i<3; i++) | + | for (i = 0; i < 3; i++) |
pix[i] = (col[i]*a/255+pix[i]*(255-a)/255); | pix[i] = (col[i]*a/255+pix[i]*(255-a)/255); | ||
} | } | ||
+ | // Fill a rect in passed image using passed bounds and colour | ||
void fillRect(char* image, int x1, int y1, int x2, int y2, int colour) { | void fillRect(char* image, int x1, int y1, int x2, int y2, int colour) { | ||
int x,y; | int x,y; | ||
− | for (y=y1; y<y2; y++) | + | for (y = y1; y < y2; y++) |
− | for (x=x1; x<x2; x++) | + | for (x = x1; x < x2; x++) |
setPixel(image,x,y,colour); | setPixel(image,x,y,colour); | ||
} | } |
Revision as of 21:35, 3 July 2006
// Licenced under LGPL: www.gnu.org/copyleft/lesser.html
- include <stdlib.h>
- include <stdio.h>
- include <string.h>
main() {
// Create a new targa image in memory char* newImage(int width, int height) { char* image = calloc(18+4*width*height+26,sizeof(char)); strcpy(image+18+4*width*height+8,"TRUEVISION-XFILE."); image[2] = 2; image[12] = width & 0xff; image[13] = (width & 0xff00) >> 8; image[14] = height & 0xff; image[15] = (height & 0xff00) >> 8; image[16] = ' '; image[17] = 8; return image; }
// Return complete byte size of passed image int getSize(unsigned char* image) { int width = (image[13]<<8)+image[12]; int height = (image[15]<<8)+image[14]; return 18+4*width*height+26; }
// Return address of pixel x,y in passed image char* getOffset(unsigned char* image, int x, int y) { int width = (image[13]<<8)+image[12]; return image+18+4*(x+y*width); }
// Return the content of pixel x,y for the passed image int getPixel(char* image, int x, int y) { return *getOffset(image,x,y); }
// Set pixel x,y to passed colour allowing for alpha void setPixel(char* image, int x, int y, int colour) { int i, col[3], a = colour >> 24; col[0] = (colour & 0xff0000) >> 16; col[1] = (colour & 0xff00) >> 8; col[2] = colour & 0xff; unsigned char* pix = getOffset(image,x,y); for (i = 0; i < 3; i++) pix[i] = (col[i]*a/255+pix[i]*(255-a)/255); }
// Fill a rect in passed image using passed bounds and colour void fillRect(char* image, int x1, int y1, int x2, int y2, int colour) { int x,y; for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) setPixel(image,x,y,colour); }
// Create test a image
char* image = newImage(200,200);
fillRect(image,50,50,100,100,0xff0000ff);
fillRect(image,75,75,175,175,0x8000ff00);
// Write test image to file and convert to jpeg int fd = creat("/var/www/wiki/targa.tga",0x755); write(fd,image,getSize(image)); system("cjpeg /var/www/wiki/targa.tga > /var/www/wiki/targa.jpg");
}