⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svg.c

📁 下载来的一个看图软件的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* libwmf (ipa/svg.c): library for wmf conversion   Copyright (C) 2000 - various; see CREDITS, ChangeLog, and sources   The libwmf Library is free software; you can redistribute it and/or   modify it under the terms of the GNU Library General Public License as   published by the Free Software Foundation; either version 2 of the   License, or (at your option) any later version.   The libwmf Library is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   Library General Public License for more details.   You should have received a copy of the GNU Library General Public   License along with the libwmf Library; see the file COPYING.  If not,   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.  */#ifdef HAVE_CONFIG_H#include "wmfconfig.h"#endif /* HAVE_CONFIG_H */#include <stdio.h>#include <string.h>#include <math.h>#include "wmfdefs.h"#ifndef WITHOUT_LAYERS#include "libwmf/svg.h"static void wmf_svg_device_open (wmfAPI*);static void wmf_svg_device_close (wmfAPI*);static void wmf_svg_device_begin (wmfAPI*);static void wmf_svg_device_end (wmfAPI*);static void wmf_svg_flood_interior (wmfAPI*,wmfFlood_t*);static void wmf_svg_flood_exterior (wmfAPI*,wmfFlood_t*);static void wmf_svg_draw_pixel (wmfAPI*,wmfDrawPixel_t*);static void wmf_svg_draw_pie (wmfAPI*,wmfDrawArc_t*);static void wmf_svg_draw_chord (wmfAPI*,wmfDrawArc_t*);static void wmf_svg_draw_arc (wmfAPI*,wmfDrawArc_t*);static void wmf_svg_draw_ellipse (wmfAPI*,wmfDrawArc_t*);static void wmf_svg_draw_line (wmfAPI*,wmfDrawLine_t*);static void wmf_svg_poly_line (wmfAPI*,wmfPolyLine_t*);static void wmf_svg_draw_polygon (wmfAPI*,wmfPolyLine_t*);static void wmf_svg_draw_polypolygon(wmfAPI * API, wmfPolyPoly_t* polypolygon);static void wmf_svg_draw_rectangle (wmfAPI*,wmfDrawRectangle_t*);static void wmf_svg_rop_draw (wmfAPI*,wmfROP_Draw_t*);static void wmf_svg_bmp_draw (wmfAPI*,wmfBMP_Draw_t*);static void wmf_svg_bmp_read (wmfAPI*,wmfBMP_Read_t*);static void wmf_svg_bmp_free (wmfAPI*,wmfBMP*);static void wmf_svg_draw_text (wmfAPI*,wmfDrawText_t*);static void wmf_svg_udata_init (wmfAPI*,wmfUserData_t*);static void wmf_svg_udata_copy (wmfAPI*,wmfUserData_t*);static void wmf_svg_udata_set (wmfAPI*,wmfUserData_t*);static void wmf_svg_udata_free (wmfAPI*,wmfUserData_t*);static void wmf_svg_region_frame (wmfAPI*,wmfPolyRectangle_t*);static void wmf_svg_region_paint (wmfAPI*,wmfPolyRectangle_t*);static void wmf_svg_region_clip (wmfAPI*,wmfPolyRectangle_t*);#include "ipa/svg.h"#include "ipa/svg/bmp.h"#include "ipa/svg/device.h"#include "ipa/svg/draw.h"#include "ipa/svg/region.h"#endif /* ! WITHOUT_LAYERS */void wmf_svg_function (wmfAPI* API){#ifndef WITHOUT_LAYERS	wmf_svg_t* ddata = 0;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	if ((API->flags & API_STANDARD_INTERFACE) == 0)	{	WMF_ERROR (API,"Can't use this device layer with 'lite' interface!");		API->err = wmf_E_DeviceError;		return;	}/* IPA function reference links */	FR->device_open    = wmf_svg_device_open;	FR->device_close   = wmf_svg_device_close;	FR->device_begin   = wmf_svg_device_begin;	FR->device_end     = wmf_svg_device_end;	FR->flood_interior = wmf_svg_flood_interior;	FR->flood_exterior = wmf_svg_flood_exterior;	FR->draw_pixel     = wmf_svg_draw_pixel;	FR->draw_pie       = wmf_svg_draw_pie;	FR->draw_chord     = wmf_svg_draw_chord;	FR->draw_arc       = wmf_svg_draw_arc;	FR->draw_ellipse   = wmf_svg_draw_ellipse;	FR->draw_line      = wmf_svg_draw_line;	FR->poly_line      = wmf_svg_poly_line;	FR->draw_polygon   = wmf_svg_draw_polygon;        FR->draw_polypolygon = wmf_svg_draw_polypolygon;	FR->draw_rectangle = wmf_svg_draw_rectangle;	FR->rop_draw       = wmf_svg_rop_draw;	FR->bmp_draw       = wmf_svg_bmp_draw;	FR->bmp_read       = wmf_svg_bmp_read;	FR->bmp_free       = wmf_svg_bmp_free;	FR->draw_text      = wmf_svg_draw_text;	FR->udata_init     = wmf_svg_udata_init;	FR->udata_copy     = wmf_svg_udata_copy;	FR->udata_set      = wmf_svg_udata_set;	FR->udata_free     = wmf_svg_udata_free;	FR->region_frame   = wmf_svg_region_frame;	FR->region_paint   = wmf_svg_region_paint;	FR->region_clip	   = wmf_svg_region_clip;/* Allocate device data structure */	ddata = (wmf_svg_t*) wmf_malloc (API,sizeof (wmf_svg_t));	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return;	}	API->device_data = (void*) ddata;/* Device data defaults */	ddata->bbox.TL.x = 0;	ddata->bbox.TL.y = 0;	ddata->bbox.BR.x = 0;	ddata->bbox.BR.y = 0;	ddata->out = 0;	ddata->Description = 0;	ddata->width = 0;	ddata->height = 0;	ddata->image.context = 0;	ddata->image.name = 0;	ddata->flags = 0;#else /* ! WITHOUT_LAYERS */	API->device_data = 0;	API->err = wmf_E_DeviceError;#endif /* ! WITHOUT_LAYERS */}#ifndef WITHOUT_LAYERSstatic void wmf_svg_draw_text (wmfAPI* API,wmfDrawText_t* draw_text){	wmf_svg_t* ddata = WMF_SVG_GetData (API);	svgFont font;	svgPoint pt;	float font_height;	float font_ratio;	float sin_theta;	float cos_theta;	double theta;	wmfStream* out = ddata->out;	WMF_DEBUG (API,"~~~~~~~~wmf_[svg_]draw_text");	if (out == 0) return;	pt = svg_translate (API,draw_text->pt);	font_height = svg_height (API,(float)  draw_text->font_height);	font_ratio  = svg_width  (API,(float) (draw_text->font_height * draw_text->font_ratio));	font_ratio /= font_height;	theta = - WMF_TEXT_ANGLE (draw_text->dc->font);	sin_theta = (float) sin (theta);	cos_theta = (float) cos (theta);	/* TODO: Scaling? */	/* TODO: Background color? */	/* TODO: string-length?? */	wmf_stream_printf (API,out,"<text ");/*	wmf_stream_printf (API,out,"x=\"%f\" ",pt.x);	wmf_stream_printf (API,out,"y=\"%f\" ",pt.y); */	wmf_stream_printf (API,out,"x=\"0\" ");	wmf_stream_printf (API,out,"y=\"0\" ");	wmf_stream_printf (API,out,"style=\"");	font = svg_font (WMF_FONT_PSNAME (WMF_DC_FONT (draw_text->dc)));	wmf_stream_printf (API,out,"font-family:%s; ",font.family);	wmf_stream_printf (API,out,"font-style:%s; ", font.style);	wmf_stream_printf (API,out,"font-weight:%s; ",font.weight);	wmf_stream_printf (API,out,"font-size:%f; ",font_height);	wmf_stream_printf (API,out,"fill:%s",svg_color_closest (WMF_DC_TEXTCOLOR (draw_text->dc)));/*	wmf_stream_printf (API,out,"\"><tspan rotate=\"%f\"\n\t>",(float) (theta * 180 / PI)); */	wmf_stream_printf (API,out,"\" transform=\"matrix(");	wmf_stream_printf (API,out,"%f %f %f %f ",cos_theta,sin_theta,-sin_theta,cos_theta);	wmf_stream_printf (API,out,"%f %f)\"\n\t>",pt.x,pt.y);	wmf_stream_printf (API,out,"%s",draw_text->str);/*	wmf_stream_printf (API,out,"</tspan></text>\n"); */	wmf_stream_printf (API,out,"</text>\n");}static void wmf_svg_udata_init (wmfAPI* API,wmfUserData_t* user_data){	/* wmf_svg_t* ddata = WMF_SVG_GetData (API); */	WMF_DEBUG (API,"~~~~~~~~wmf_[svg_]udata_init");	}static void wmf_svg_udata_copy (wmfAPI* API,wmfUserData_t* user_data){	/* wmf_svg_t* ddata = WMF_SVG_GetData (API); */	WMF_DEBUG (API,"~~~~~~~~wmf_[svg_]udata_copy");	}static void wmf_svg_udata_set (wmfAPI* API,wmfUserData_t* user_data){	/* wmf_svg_t* ddata = WMF_SVG_GetData (API); */	WMF_DEBUG (API,"~~~~~~~~wmf_[svg_]udata_set");	}static void wmf_svg_udata_free (wmfAPI* API,wmfUserData_t* user_data){	/* wmf_svg_t* ddata = WMF_SVG_GetData (API); */	WMF_DEBUG (API,"~~~~~~~~wmf_[svg_]udata_free");	}static svgFont svg_font (char* ps_name){	svgFont* font = svg_known_fonts;	while (font->ps_name)	{	if (strcmp (ps_name,font->ps_name) == 0) break;		font++;	}	return (*font);}static char* svg_color_closest (wmfRGB* rgb){	int i;	int i_best;	int d;	int d_r;	int d_g;	int d_b;	int d_best;	i_best = 0;	d_r = (int) rgb->r - (int) svg_named_color[i_best].r;	d_r = ABS (d_r);	d_g = (int) rgb->g - (int) svg_named_color[i_best].g;	d_g = ABS (d_g);	d_b = (int) rgb->b - (int) svg_named_color[i_best].b;	d_b = ABS (d_b);	d_best = MAX (d_r,d_g);	d_best = MAX (d_b,d_best);	for (i = 1; i < 147; i++)	{	d_r = (int) rgb->r - (int) svg_named_color[i].r;		d_r = ABS (d_r);		d_g = (int) rgb->g - (int) svg_named_color[i].g;		d_g = ABS (d_g);		d_b = (int) rgb->b - (int) svg_named_color[i].b;		d_b = ABS (d_b);		d = MAX (d_r,d_g);		d = MAX (d_b,d);		if (d == 0)		{	i_best = i;			break;		}		if (d < d_best)		{	i_best = i;			d_best = d;		}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -