Back to index

lightning-sunbird  0.9+nobinonly
Functions
write_png.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
#include "write_png.h"

Go to the source code of this file.

Functions

static void unpremultiply_data (png_structp png, png_row_infop row_info, png_bytep data)
void write_png_argb32 (char *buffer, FILE *file, int width, int height, int stride)

Function Documentation

static void unpremultiply_data ( png_structp  png,
png_row_infop  row_info,
png_bytep  data 
) [static]

Definition at line 35 of file write_png.c.

{
    int i;

    for (i = 0; i < row_info->rowbytes; i += 4) {
        unsigned char *b = &data[i];
        unsigned int pixel;
        unsigned char alpha;

       memcpy (&pixel, b, sizeof (unsigned int));
       alpha = (pixel & 0xff000000) >> 24;
        if (alpha == 0) {
           b[0] = b[1] = b[2] = b[3] = 0;
       } else {
            b[0] = (((pixel & 0x0000ff) >>  0) * 255 + alpha / 2) / alpha;
            b[1] = (((pixel & 0x00ff00) >>  8) * 255 + alpha / 2) / alpha;
            b[2] = (((pixel & 0xff0000) >> 16) * 255 + alpha / 2) / alpha;
           b[3] = alpha;
       }
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void write_png_argb32 ( char *  buffer,
FILE file,
int  width,
int  height,
int  stride 
)

Definition at line 58 of file write_png.c.

{
    int i;
    png_struct *png;
    png_info *info;
    png_byte **rows;
    png_color_16 white;
    
    rows = malloc (height * sizeof(png_byte*));

    for (i = 0; i < height; i++) {
       rows[i] = buffer + i * stride;
    }

    png = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    info = png_create_info_struct (png);

    png_init_io (png, file);
    png_set_IHDR (png, info,
                width, height, 8,
                PNG_COLOR_TYPE_RGB_ALPHA, 
                PNG_INTERLACE_NONE,
                PNG_COMPRESSION_TYPE_DEFAULT,
                PNG_FILTER_TYPE_DEFAULT);

    white.red = 0xff;
    white.blue = 0xff;
    white.green = 0xff;
    png_set_bKGD (png, info, &white);

    png_set_write_user_transform_fn (png, unpremultiply_data);
    png_set_bgr (png);

    png_write_info (png, info);
    png_write_image (png, rows);
    png_write_end (png, info);

    png_destroy_write_struct (&png, &info);

    free (rows);
}

Here is the call graph for this function:

Here is the caller graph for this function: