Ejemplo n.º 1
0
GpStatus WINGDIPAPI
GdiplusStartup (ULONG_PTR *token, const GdiplusStartupInput *input, GdiplusStartupOutput *output)
{
	GpStatus status = Ok;
	/* don't initialize multiple time, e.g. for each appdomain */
	if (!startup) {
		startup = TRUE;
		status = initCodecList ();
		if (status != Ok)
			return status;
		FcInit ();
		*token = 1;
		gdip_get_display_dpi();
	}
	return status;
}
Ejemplo n.º 2
0
static GpStatus
gdip_load_png_properties (png_structp png_ptr, png_infop info_ptr, png_infop end_ptr, BitmapData *bitmap_data)
{
#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED)
    bitmap_data->image_flags |= ImageFlagsHasRealDPI;
    bitmap_data->dpi_horz = png_get_x_pixels_per_inch(png_ptr, info_ptr);
    bitmap_data->dpi_vert = png_get_y_pixels_per_inch(png_ptr, info_ptr);
#elif defined(PNG_pHYs_SUPPORTED)
    if ((info_ptr->valid & PNG_INFO_pHYs) && (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)) {
        bitmap_data->image_flags |= ImageFlagsHasRealDPI;
        bitmap_data->dpi_horz = info_ptr->x_pixels_per_unit * 0.0254;
        bitmap_data->dpi_vert = info_ptr->y_pixels_per_unit * 0.0254;
    }
#endif
    /* default to screen resolution (if nothing was provided or available) */
    if (bitmap_data->dpi_horz == 0 || bitmap_data->dpi_vert == 0) {
        bitmap_data->dpi_horz = bitmap_data->dpi_vert = gdip_get_display_dpi ();
    }

#if defined(PNG_iCCP_SUPPORTED)
    {
        png_charp	name;
        png_charp	profile;
        png_uint_32	proflen;
        int		compression_type;

        if (png_get_iCCP(png_ptr, info_ptr, &name, &compression_type, &profile, &proflen)) {
            gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagICCProfileDescriptor, (BYTE*)name);
            gdip_bitmapdata_property_add_byte(bitmap_data, PropertyTagICCProfile, (BYTE)compression_type);
        }
    }
#endif

#if defined(PNG_gAMA_SUPPORTED)
    {
        double	gamma;

        if (png_get_gAMA(png_ptr, info_ptr, &gamma)) {
            gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagGamma, 100000, gamma * 100000);
        }
    }
#endif

#if defined(PNG_cHRM_SUPPORTED)
    {
        double	white_x;
        double	white_y;
        double	red_x;
        double	red_y;
        double	green_x;
        double	green_y;
        double	blue_x;
        double	blue_y;

        if (png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y)) {
            BYTE *buffer;
            guint32		*ptr;

            buffer = GdipAlloc(6 * (sizeof(png_uint_32) + sizeof(png_uint_32)));
            if (buffer != NULL)  {
                ptr = (guint32 *)buffer;

                ptr[0] = (guint32)(red_x * 100000);
                ptr[1] = 1000000;
                ptr[2] = (guint32)(red_y * 100000);
                ptr[3] = 100000;

                ptr[4] = (guint32)(green_x * 100000);
                ptr[5] = 1000000;
                ptr[6] = (guint32)(green_y * 100000);
                ptr[7] = 100000;

                ptr[8] = (guint32)(blue_x * 100000);
                ptr[9] = 100000;
                ptr[10] = (guint32)(blue_y * 100000);
                ptr[11] = 100000;

                gdip_bitmapdata_property_add (bitmap_data, PropertyTagPrimaryChromaticities,
                                              6 * (sizeof(guint32) + sizeof(guint32)), PropertyTagTypeRational, buffer);

                ptr[0] = (guint32)(white_x * 100000);
                ptr[1] = 1000000;
                ptr[2] = (guint32)(white_y * 100000);
                ptr[3] = 100000;
                gdip_bitmapdata_property_add (bitmap_data, PropertyTagWhitePoint,
                                              2 * (sizeof(guint32) + sizeof(guint32)), PropertyTagTypeRational, buffer);

                GdipFree(buffer);
            }
        }
    }
#endif

#if defined(PNG_pHYs_SUPPORTED)
    {
        int		unit_type;
        png_uint_32	res_x;
        png_uint_32	res_y;

        if (png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type)) {
            gdip_bitmapdata_property_add_byte(bitmap_data, PropertyTagPixelUnit, (BYTE)unit_type);
            gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagPixelPerUnitX, res_x);
            gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagPixelPerUnitY, res_y);
        }
    }
#endif

#if defined(PNG_TEXT_SUPPORTED)
    {
        int		num_text;
        png_textp	text_ptr;

        if (png_get_text(png_ptr, info_ptr, &text_ptr, &num_text)) {
            if (num_text > 0) {
                gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagExifUserComment, (BYTE*)text_ptr[0].text);
            }
        }
    }
#endif

    return Ok;
}