예제 #1
0
파일: cdwwmf.c 프로젝트: Vulcanior/IUP
static void cdcreatecanvas(cdCanvas* canvas, void* data)
{
  cdCtxCanvas* ctxcanvas;
  char* strdata = (char*)data;
  int w = 0, h = 0;
  double res = 0, xres, yres;
  FILE* fh;
  char filename[10240] = "";
  
  /* Inicializa parametros */
  if (strdata == NULL) 
    return;


  strdata += cdGetFileName(strdata, filename);
  if (filename[0] == 0)
    return;
  
  sscanf(strdata,"%dx%d %lg", &w, &h, &res); 
  if (w == 0 || h == 0)
    return;

  if (res)
  {
    xres = res;
    yres = res;
  }
  else
  {
    HDC ScreenDC = GetDC(NULL);
    xres = ((double)GetDeviceCaps(ScreenDC, LOGPIXELSX)) / 25.4;
    yres = ((double)GetDeviceCaps(ScreenDC, LOGPIXELSY)) / 25.4;
    ReleaseDC(NULL, ScreenDC);
  }
  
  /* Verifica se o arquivo pode ser aberto para escrita */
  fh = fopen(filename, "w");
  if (fh == 0)
    return;
  
  fclose(fh);
  
  /* Inicializa driver WIN32 */
  ctxcanvas = cdwCreateCanvas(canvas, NULL, CreateMetaFile(NULL), CDW_WMF);

  canvas->w = w;
  canvas->h = h;
  canvas->xres = xres;
  canvas->yres = yres;
  canvas->w_mm = ((double)w) / res;
  canvas->h_mm = ((double)h) / res;
  canvas->bpp = 24;
  ctxcanvas->clip_pnt[2].x = ctxcanvas->clip_pnt[1].x = canvas->w - 1;
  ctxcanvas->clip_pnt[3].y = ctxcanvas->clip_pnt[2].y = canvas->h - 1;
  
  /* Inicializacao de variaveis particulares para o WMF */
  ctxcanvas->filename = cdStrDup(filename);
}
예제 #2
0
파일: cdwemf.c 프로젝트: LuaDist/cd
/*
%F cdCreateCanvas para EMF.
O DC é um EMF em memoria.
*/
static void cdcreatecanvas(cdCanvas* canvas, void* data)
{
  cdCtxCanvas* ctxcanvas;
  char* strdata = (char*)data;
  int w = 0, h = 0;
  double xres, yres;
  FILE* file;
  char filename[10240] = "";
  HDC ScreenDC, hDC;
  RECT rect;
  
  /* Inicializa parametros */
  if (strdata == NULL) 
    return;

  strdata += cdGetFileName(strdata, filename);
  if (filename[0] == 0)
    return;
 
  sscanf(strdata,"%dx%d", &w, &h); 
  if (w == 0 || h == 0)
    return;
  
  /* Verifica se o arquivo pode ser aberto para escrita */
  file = fopen(filename, "wb");
  if (file == NULL) return;
  fclose(file);
  
  ScreenDC = GetDC(NULL);
  /* LOGPIXELS can not be used for EMF */
  xres = (double)GetDeviceCaps(ScreenDC, HORZRES) / (double)GetDeviceCaps(ScreenDC, HORZSIZE);
  yres = (double)GetDeviceCaps(ScreenDC, VERTRES) / (double)GetDeviceCaps(ScreenDC, VERTSIZE);
  rect.left = 0;
  rect.top = 0;
  rect.right = (int)(100. * w / xres);
  rect.bottom = (int)(100. * h / yres);
  hDC = CreateEnhMetaFile(ScreenDC,filename,&rect,NULL);
  ReleaseDC(NULL, ScreenDC);
  
  if(!hDC)
    return;
  
  /* Inicializa driver WIN32 */
  ctxcanvas = cdwCreateCanvas(canvas, NULL, hDC, CDW_EMF);

  canvas->w = w;
  canvas->h = h;
  canvas->xres = xres;
  canvas->yres = yres;
  canvas->w_mm = ((double)w) / xres;
  canvas->h_mm = ((double)h) / yres;
  canvas->bpp = 24;
  ctxcanvas->clip_pnt[2].x = ctxcanvas->clip_pnt[1].x = canvas->w - 1;
  ctxcanvas->clip_pnt[3].y = ctxcanvas->clip_pnt[2].y = canvas->h - 1;
}
예제 #3
0
/*
%F cdCreateCanvas para EMF.
O DC é um EMF em memoria.
*/
static void cdcreatecanvas(cdCanvas* canvas, void* data)
{
  char* strdata = (char*)data;
  char filename[10240] = "";
  Metafile* metafile;
  
  /* Inicializa parametros */
  if (strdata == NULL) 
    return;
  
  strdata += cdGetFileName(strdata, filename);
  if (filename[0] == 0)
    return;
  
  int w = 0, h = 0;
  sscanf(strdata,"%dx%d", &w, &h); 
  if (w == 0 || h == 0)
    return;
  
  {
    /* Verifica se o arquivo pode ser aberto para escrita */
    FILE* file = fopen(filename, "wb");
    if (file == NULL)
      return;
    fclose(file);
  }

  {
    HDC ScreenDC = GetDC(NULL);
    /* LOGPIXELS can not be used for EMF */
    canvas->xres = (double)GetDeviceCaps(ScreenDC, HORZRES) / (double)GetDeviceCaps(ScreenDC, HORZSIZE);
    canvas->yres = (double)GetDeviceCaps(ScreenDC, VERTRES) / (double)GetDeviceCaps(ScreenDC, VERTSIZE);

    Rect frameRect(0, 0, (int)(100 * w / canvas->xres), (int)(100 * h / canvas->yres));

    metafile = new Metafile(cdwpString2Unicode(filename, strlen(filename)), 
                                      ScreenDC, frameRect, MetafileFrameUnitGdi, EmfTypeEmfPlusDual, NULL);

    ReleaseDC(NULL, ScreenDC);
  }

  canvas->w = w;
  canvas->h = h;
  canvas->bpp = 24;

  Graphics* graphics = new Graphics(metafile);
  
  /* Inicializa driver WIN32 */
  cdCtxCanvas* ctxcanvas = cdwpCreateCanvas(canvas, graphics, CDW_EMF);

  /* Inicializacao de variaveis particulares para o EMF */
  ctxcanvas->metafile = metafile;
}
예제 #4
0
파일: cdmf.c 프로젝트: LuaDist/cd
void cdcreatecanvasMF(cdCanvas *canvas, void *data)
{
  char filename[10240] = "";
  char* strdata = (char*)data;
  double w_mm = INT_MAX*3.78, h_mm = INT_MAX*3.78, res = 3.78;
  cdCtxCanvas* ctxcanvas;
  int size;

  strdata += cdGetFileName(strdata, filename);
  if (filename[0] == 0)
    return;

  sscanf(strdata, "%lgx%lg %lg", &w_mm, &h_mm, &res);

  ctxcanvas = (cdCtxCanvas *)malloc(sizeof(cdCtxCanvas));
  memset(ctxcanvas, 0, sizeof(cdCtxCanvas));

  ctxcanvas->file = fopen(filename, "w");
  if (!ctxcanvas->file)
  {
    free(ctxcanvas);
    return;
  }

  size = strlen(filename);
  ctxcanvas->filename = malloc(size+1);
  memcpy(ctxcanvas->filename, filename, size+1);

  ctxcanvas->canvas = canvas;

  /* update canvas context */
  canvas->w = (int)(w_mm * res);
  canvas->h = (int)(h_mm * res);
  canvas->w_mm = w_mm;
  canvas->h_mm = h_mm;
  canvas->bpp = 24;
  canvas->xres = res;
  canvas->yres = res;
  canvas->ctxcanvas = ctxcanvas;

  ctxcanvas->last_line_style = -1;
  ctxcanvas->last_fill_mode = -1;

  fprintf(ctxcanvas->file, "CDMF %d %d\n", canvas->w, canvas->h);
}
예제 #5
0
파일: cdcairopdf.c 프로젝트: LuaDist/cd
static void cdcreatecanvas(cdCanvas* canvas, void* data)
{
  cdCtxCanvas* ctxcanvas;
  char* strdata = (char*)data;
  char filename[10240] = "";
  cairo_surface_t *surface;
  int res = 300;
  double w_pt;         /* Largura do papel (points) */
  double h_pt;         /* Altura do papel (points) */
  double scale;          /* Fator de conversao de coordenadas (pixel2points) */
  int landscape = 0;         /* page orientation */

  /* Starting parameters */
  if (strdata == NULL) 
    return;

  strdata += cdGetFileName(strdata, filename);
  if (filename[0] == 0)
    return;

  cdSetPaperSize(CD_A4, &w_pt, &h_pt);

  while (*strdata != '\0')
  {
    while (*strdata != '\0' && *strdata != '-') 
      strdata++;

    if (*strdata != '\0')
    {
      float num;
      strdata++;
      switch (*strdata++)
      {
      case 'p':
        {
          int paper;
          sscanf(strdata, "%d", &paper);
          cdSetPaperSize(paper, &w_pt, &h_pt);
          break;
        }
      case 'w':
        sscanf(strdata, "%g", &num);
        w_pt = CD_MM2PT*num;
        break;
      case 'h':
        sscanf(strdata, "%g", &num);
        h_pt = CD_MM2PT*num;
        break;
      case 'o':
        landscape = 1;
        break;
      case 's':
        sscanf(strdata, "%d", &res);
        break;
      }
    }

    while (*strdata != '\0' && *strdata != ' ') 
      strdata++;
  }

  if (landscape)
    _cdSwapDouble(w_pt, h_pt);

  scale = 72.0/res;

  canvas->w = (int)(w_pt/scale + 0.5);   /* Converte p/ unidades do usuario */
  canvas->h = (int)(h_pt/scale + 0.5); /* Converte p/ unidades do usuario */
  canvas->w_mm = w_pt/CD_MM2PT;   /* Converte p/ milimetros */
  canvas->h_mm = h_pt/CD_MM2PT; /* Converte p/ milimetros */
  canvas->bpp = 24;
  canvas->xres = canvas->w / canvas->w_mm;
  canvas->yres = canvas->h / canvas->h_mm;

	surface = cairo_pdf_surface_create(filename, w_pt, h_pt);

  /* Starting Cairo driver */
  ctxcanvas = cdcairoCreateCanvas(canvas, cairo_create(surface));
  cairo_surface_destroy(surface);
}
예제 #6
0
/*
%F Cria um canvas CGM.
Parametros passados em data:
[nome]   nome do arquivo de saida <= 255 caracteres
[size]   tamanho do papel
-t   codificacao clear text se nao binaria
*/
static void cdcreatecanvas(cdCanvas* canvas, void *data)
{
  cdCtxCanvas *ctxcanvas;
  char *line = (char *)data;
  char c;
  char words[4][256];
  char filename[10240] = "";
  double w=0, h=0, r=0;
  int p=0;
  int i, n;

  line += cdGetFileName(line, filename);
  if (filename[0] == 0)
    return;
  
  n = sscanf(line, "%s %s %s %s", words[0], words[1], words[2], words[3]);
  
  ctxcanvas = (cdCtxCanvas *)malloc(sizeof(cdCtxCanvas));

  canvas->ctxcanvas = ctxcanvas;
  ctxcanvas->canvas = canvas;

  strcpy(ctxcanvas->filename, filename);
  
  canvas->w_mm = (double)INT_MAX*3.78;
  canvas->h_mm = (double)INT_MAX*3.78;
  canvas->xres = 3.78;
  canvas->yres = 3.78;
  canvas->bpp = 24;

  ctxcanvas->vdc_int_prec = 16;
  ctxcanvas->codificacao = CD_BIN;
  ctxcanvas->first = 1;
  ctxcanvas->clip.first = 1;
  ctxcanvas->patindex = 1;
  
  ctxcanvas->hassize = 0;		/* Indica se foi passado um tamanho para o canvas */
  
  for (i = 0; i < n; i++)
  {
    if (sscanf ( words[i], "%lgx%lg",  &w, &h )== 2)
    {
      canvas->w_mm = w;
      canvas->h_mm = h;
      ctxcanvas->hassize = 1;
    }
    else if (sscanf ( words[i], "%lg", &r ) == 1)
      canvas->yres = canvas->xres = r;
    else if (sscanf ( words[i], "-%c%d", &c, &p )>0)
    {
      if ( c=='t' ) 
        ctxcanvas->codificacao = CD_CLEAR_TEXT;
      else if ( c=='p' ) 
        ctxcanvas->vdc_int_prec = p;
    }
  }
  
  if ( ctxcanvas->vdc_int_prec != 16 && w == 0.0 && h == 0.0 )
  {
    canvas->w_mm = (double) (pow(2,p)/2)-1;
    canvas->h_mm = (double) (pow(2,p)/2)-1;
  }
  
  /* update canvas context */
  canvas->w = (int)(canvas->w_mm * canvas->xres);
  canvas->h = (int)(canvas->h_mm * canvas->yres);
  
  ctxcanvas->cgm = cgm_begin_metafile ( ctxcanvas->filename, ctxcanvas->codificacao, "CD - CanvasDraw, Tecgraf/PUC-RIO" );
  
  metafile_descriptor(ctxcanvas);
  
  cgm_begin_picture ( ctxcanvas->cgm, "Picture x" );

  picture_descriptor (ctxcanvas);

  cgm_clip_rectangle ( ctxcanvas->cgm, 0, 0, (double)canvas->w, (double)canvas->h);
  cgm_clip_indicator (ctxcanvas->cgm, 0);

  cgm_begin_picture_body ( ctxcanvas->cgm );
  
  control_elements (ctxcanvas);

  cgm_marker_type( ctxcanvas->cgm, MARKER_DOT);
  cgm_marker_size( ctxcanvas->cgm, 1.0);
}