?? g2_gd.c
字號:
/******************************************************************************* Copyright (C) 1998-2001 Ljubomir Milanovic & Horst Wagner** This file is part of the g2 library**** This library is free software; you can redistribute it and/or** modify it under the terms of the GNU Lesser General Public** License as published by the Free Software Foundation; either** version 2.1 of the License, or (at your option) any later version.**** This 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** Lesser General Public License for more details.**** You should have received a copy of the GNU Lesser General Public** License along with this library; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA******************************************************************************/#include <stdio.h>#include <stdlib.h>#include <math.h>#include "g2.h"#include "g2_device.h"#include "g2_util.h"#include "g2_config.h"#include "g2_gd_P.h"#include "g2_gd.h"#define PDP ((struct g2_gd_STRUCT *)pdp)#include "g2_gd_funix.h"#ifndef PI#define PI 3.14159265358979323846#endif /* PI *//** * \ingroup physdev * \defgroup GD GD *//** * * Create a GD device. * * \param filename output file name * \param width width * \param height height * \param gd_type file type, see ::g2_gd_type * * \return physical device id * * \ingroup GD */int g2_open_gd(const char *filename, int width, int height, enum g2_gd_type gd_type){ int pid=-1; g2_gd_STRUCT *pdp; pdp = (g2_gd_STRUCT *)malloc(sizeof(g2_gd_STRUCT)); pdp->width = width; pdp->height = height; pdp->gd_type = gd_type; pdp->im = gdImageCreate(width,height); pdp->f = fopen(filename,"wb"); pdp->NoOfInks = 0; pdp->BackCol = 0; pid = g2_register_physical_device(pid, pdp, g2_IntCoor, g2_gd_funix, 1.0, -1.0, 0.0, height-1); g2_gd_Clear(pid,pdp); g2_set_line_width(pid, 0.0); g2_set_font_size(pid, 12.0); g2_allocate_basic_colors(pid); g2_pen(pid, 1); return pid;}int g2_gd_Alloc_Basic(int pid, void *pdp) { int icol; for (icol=0;icol<32;icol++) gdImageColorAllocate(PDP->im,g2_Basic_Colors[icol][0]/256,g2_Basic_Colors[icol][1]/256,g2_Basic_Colors[icol][2]/256); PDP->NoOfInks = 32; return 0; }int g2_gd_Clear(int pid, void *pdp) { gdImageFilledRectangle(PDP->im, 0, 0, PDP->width, PDP->height, PDP->BackCol); return 0; }int g2_gd_Save(int pid, void *pdp) { if (PDP->gd_type == g2_gd_png) gdImagePng(PDP->im,PDP->f); else if (PDP->gd_type == g2_gd_jpeg) gdImageJpeg(PDP->im,PDP->f,-1); fflush(PDP->f); rewind(PDP->f); return 0; }int g2_gd_Delete(int pid, void *pdp) { g2_gd_Save(pid,pdp); fclose(PDP->f); gdImageDestroy(PDP->im); free(PDP); return 0; }int g2_gd_Flush(int pid, void *pdp) { return 0; }int g2_gd_Pen(int pid, void *pdp, int color) { PDP->CurCol = color; return 0; }int g2_gd_Ink(int pid, void *pdp, double red, double green, double blue) { if(PDP->NoOfInks == 256) return -1; else PDP->NoOfInks++; return gdImageColorAllocate(PDP->im,(int)(255*red),(int)(255*green),(int)(255*blue)); }int g2_gd_ClearPalette(int pid, void *pdp) { int i; for (i=0;i<PDP->NoOfInks;i++) gdImageColorDeallocate(PDP->im,i); PDP->NoOfInks = 0; return 0; }int g2_gd_ResetPalette(int pid, void *pdp) { g2_gd_ClearPalette(pid,pdp); g2_gd_Alloc_Basic(pid,pdp); return 0; }int g2_gd_SetBackground(int pid, void *pdp, int color) { PDP->BackCol = color; return 0; }int g2_gd_SetLineWidth(int pid, void *pdp, int w) { PDP->LineWidth = w; return 0; }/* { if (PDP->brush != NULL) { gdImageDestroy(PDP->brush); } PDP->brush = gdImageCreate(w,w); gdImageColorTransparent(PDP->brush,0); gdImageColorAllocate(PDP->brush,0,0,0); gdImageColorAllocate(PDP->brush, gdImageRed(PDP->im,PDP->CurCol), gdImageGreen(PDP->im,PDP->CurCol), gdImageBlue(PDP->im,PDP->CurCol)); gdImageArc(PDP->brush, w/2, w/2, w/2,w/2, 0, 360, 1); gdImageFill(PDP->brush,w/2,w/2,1); gdImageSetBrush(PDP->im, PDP->brush); PDP->OldCol = PDP->CurCol; PDP->CurCol = gdBrushed; } else { PDP->CurCol = PDP->OldCol; } return 0; }*/ int g2_gd_SetDash(int pid, void *pdp, int n, char *data) { return 0; }int g2_gd_SetDashX(int pid, void *pdp, int N, double *dashes) { return 0; }int g2_gd_SetFontSize(int pid, void *pdp, int size) { if (size <=10) PDP->FontSize = gdFontTiny; else if (size <=12) PDP->FontSize = gdFontSmall; else if (size <=13) PDP->FontSize = gdFontMediumBold; else if (size <=15) PDP->FontSize = gdFontLarge; else PDP->FontSize = gdFontGiant; return 0; }int g2_gd_Plot(int pid, void *pdp, int x, int y) { gdImageSetPixel(PDP->im, x, y, PDP->CurCol); return 0; }int g2_gd_Line(int pid, void *pdp, int x1, int y1, int x2, int y2) { if (PDP->LineWidth <= 1) gdImageLine(PDP->im, x1, y1, x2, y2, PDP->CurCol); else { float dx,dy,l; gdPoint points[4]; dx = -(float)(y2-y1); dy = (float)(x2-x1); l = (float)(PDP->LineWidth/sqrt(dy*dy+dx*dx)/2.); dx = dx*l; dy = dy*l; points[0].x = (int)(x1+dx); points[0].y = (int)(y1+dy); points[1].x = (int)(x1-dx); points[1].y = (int)(y1-dy); points[2].x = (int)(x2-dx); points[2].y = (int)(y2-dy); points[3].x = (int)(x2+dx); points[3].y = (int)(y2+dy); gdImageFilledPolygon(PDP->im,points,4,PDP->CurCol); } return 0; }int g2_gd_PolyLine(int pid, void *pdp, int N, int *points) { return 0; }int g2_gd_Triangle(int pid, void *pdp, int x1, int y1, int x2, int y2, int x3, int y3) { return 0; }int g2_gd_FilledTriangle(int pid, void *pdp, int x1, int y1, int x2, int y2, int x3, int y3) { return 0; }int g2_gd_Rectangle(int pid, void *pdp, int x, int y, int x2, int y2) { gdImageRectangle(PDP->im, x, y, x2, y2, PDP->CurCol); return 0; }int g2_gd_FilledRectangle(int pid, void *pdp, int x, int y, int x2, int y2) { gdImageFilledRectangle(PDP->im, x, y, x2, y2, PDP->CurCol); return 0; }int g2_gd_Polygon(int pid, void *pdp, int N, int *points) { return 0; }int g2_gd_FilledPolygon(int pid, void *pdp, int N, int *points) { gdPoint *GIFPolygon; int i; GIFPolygon = (gdPoint *)malloc(N*sizeof(gdPoint)); for (i=0;i<N;i++) { GIFPolygon[i].x = points[2*i]; GIFPolygon[i].y = points[2*i+1]; } gdImageFilledPolygon(PDP->im,GIFPolygon,N,PDP->CurCol); free(GIFPolygon); return 0; }int g2_gd_Circle(int pid, void *pdp, int x, int y, int r) { gdImageArc(PDP->im, (int)x, (int)y, (int)r, (int)r, 0, 360, PDP->CurCol); return 0; }int g2_gd_FilledCircle(int pid, void *pdp, int x, int y, int r) { return 0; }int g2_gd_Ellipse(int pid, void *pdp, int x, int y, int r1, int r2) { return 0; }int g2_gd_FilledEllipse(int pid, void *pdp, int x, int y, int r1, int r2) { return 0; }int g2_gd_Arc(int pid, void *pdp, int x, int y, int r1, int r2, double a1, double a2) { gdImageArc(PDP->im,x,y,2*r1,2*r2,dtoi(a1),dtoi(a2),PDP->CurCol); return 0; }int g2_gd_FilledArc(int pid, void *pdp, int x, int y, int r1, int r2, double a1, double a2) { return 0; }int g2_gd_DrawString(int pid, void *pdp, int x, int y, const char *text) { gdImageString(PDP->im,PDP->FontSize,x,y+2-PDP->FontSize->h,(unsigned char *)text,PDP->CurCol); return 0; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -