Implementierung

Top  Previous  Next

#include "..\..\..\include\moskito.h"

#include "..\..\..\include\assert.h"

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <string.h>

#include "..\..\..\include\loadsave.h"

 

 

//##############################################################################

//

// Output Pixel to Position (x,y) in Buffer

//

void putPix( char *p_output_buffer, int linesize, int destSizeX,

       int destSizeY, int x, int y, int r, int g, int b){

   p_output_buffer[y*linesize+3*x+0]=r;

   p_output_buffer[y*linesize+3*x+1]=g;

   p_output_buffer[y*linesize+3*x+2]=b;

}

 

 

static void DLLENTRY PPMplotRasterElement(PRASTER_ELEMENT raster, int hilightEbene,

                PZEICHENDATEN data, FarbDefinition fd,

                RASTER_SETTINGS *rSet, double x1, double y1,

                double x2, double y2, int flags){

   char buffer[1000];

   char magic[100];

   FILE *file;

   // int w,h;

   int x,y;

   int maxPixelValue;

   int lightning=100;

   double minY, maxY,minX,maxX;

   int linesize;

   char initial[300], path[300];

   char *p_output_buffer;

   int nRasterXSize, nRasterYSize, destSizeX, destSizeY, count, startX, startY;

 

   // if Output System has no Raster leave here

   if(!data->addRaster) return;

 

   /* only use if driver has ability to rescale itself */

   // w=fabs(x2-x1)*data->scaleBeforeUse/data->pixelSize;

   // h=fabs(y2-y1)*data->scaleBeforeUse/data->pixelSize;

   // if(w>500000) w=500000;

   // if(h>500000) h=500000;

 

   // if zoomed to show only part of Picture

   // only store this part later

   minY=0;

   maxY=1;

   minX=0;

   maxX=1;

   if(data->bottom-data->offsY>y1-data->rotY){

       minY=(data->bottom-data->offsY-y1+data->rotY)/(y2-y1)/1.03;

   }

   if(data->top-data->offsY<y2-data->rotY){

       maxY=(data->top-data->offsY-y1+data->rotY)/(y2-y1)*1.03;

   }

   if(data->left-data->offsX>x1-data->rotX){

       minX=(data->left-data->offsX-x1+data->rotX)/(x2-x1)/1.03;

   }

   if(data->right-data->offsX<x2-data->rotX){

       maxX=(data->right-data->offsX-x1+data->rotX)/(x2-x1)*1.03;

   }

   if(!(maxX>minX && maxY>minY)){

     // Picture is invisible, leave now

     return;

   }

 

   /*

   ** Open the input File

   */

   // direct name given

   file = fopen( rSet->file, "r" );

 

   if (file == NULL) {

     // file may be stored in GDS$Raster

       DBgetInitialValueText(DBowner(DBowner(DBowner(DBowner(raster)))),

          "GDS$RASTER",initial,"");

      SYSfullPath ( "GDS$RASTER", "", rSet->file,

          ".PPM",path,GDS_RASTER,initial,FALSE);

       file = fopen( path, "r" );

 

     // file may be stored in same directory as the plan

     if (file == NULL) {

       PPLANS plan;

       PLAN_SETTINGS plSet;

       plan=DBowner(DBowner(raster));

       DBreturnPlanSettings(plan,&plSet,1);

       SYSfullPath ( "", plSet.pfad, rSet->file, ".PPM",path,"","",FALSE);

         file = fopen( path, "r" );

 

       // no raster present, give up now

       if (file == NULL) {

       return;

       }

     }

 

   }

 

   flags |=RASTER_FLAG_SIZE;

 

   // get file header with magic and size

   if(!fgets(buffer,1000,file)){

     fclose(file);

     return;

   }

   count=sscanf(buffer,"%s %d %d", &magic, &nRasterXSize, &nRasterYSize);

   if(count<1 || strcmp(magic,"P3")){

     fclose(file);

     return;

   }

   if(count<3){

     while(TRUE){

       if(!fgets(buffer,1000,file)){

       fclose(file);

       return;

       }

       if(buffer[0]=='#') continue;

       count=sscanf(buffer,"%d %d", &nRasterXSize, &nRasterYSize);

       if(count==2) break;

     }

   }

 

   // read Range of pixel values, but we do not use it

   fscanf(file,"%d",&maxPixelValue);

 

   //############################################################################

   //

   // minX,minY,maxX,maxY sind die gewünschten Ausschnitte, Wetebereiche 0 - 1

   //

 

   destSizeX=(maxX-minX)*nRasterXSize;

   destSizeY=(maxY-minY)*nRasterYSize;

   startX=minX*nRasterXSize;

   startY=minY*nRasterYSize;

 

   /* only use if driver has ability to rescale itself */

   // if(w<nRasterXSize)

   // destSizeX=(maxX-minX)*w;

   // else

   // destSizeX=(maxX-minX)*nRasterXSize;

   // if(h<nRasterYSize)

   // destSizeY=(maxY-minY)*h;

   // else

   // destSizeY=(maxY-minY)*nRasterYSize;

 

   // Allocate Buffer for picture

   p_output_buffer=Malloc(3*(destSizeX+3)*destSizeY+10000);

 

   linesize=(destSizeX*3);

 

   //##############################################################################

   // Read the picture and store values in Array

   //

   for(x=0;x<nRasterXSize;x++){

     for(y=0;y<nRasterXSize;y++){

       int r,g,b;

       fscanf(file,"%d %d %d",&r,&g,&b);

       if(x>=startX && x<startX+destSizeX){

       if(y>=startY && y<startY+destSizeY){

          putPix(p_output_buffer,linesize, destSizeX, destSizeY,x-startX,y-startY,r,g,b);

       }

       }

     }

   }

   //

   //##############################################################################

 

   lightning=100;

   if(data->modLayer[hilightEbene].mLightning){

       lightning=data->modLayer[hilightEbene].lightningVal;

   }

 

   data->addRaster(data, fd, 3, destSizeX, destSizeY, p_output_buffer, flags,

                   hilightEbene, x1+minX*(x2-x1), y1+minY*(y2-y1),

          x1+maxX*(x2-x1), y1+maxY*(y2-y1), NULL, destSizeX*destSizeY*3, lightning, TRUE);

 

   Free(p_output_buffer);

 

   fclose(file);

 

   return;

}

 

 

//#####################################################################################

 

static void DLLENTRY PPMdeleteRasterElement(PRASTER_ELEMENT raster, RASTER_SETTINGS *rSet){

}

 

//#####################################################################################

 

 

RASTER_PROC procsPPM={

  sizeof(RASTER_PROC),

  NULL,

  "PPM",

  NULL,

  NULL,

  PPMplotRasterElement,

  PPMdeleteRasterElement

 };

 

 

RASTER_PROC * EXPORTENTRY __RASTER_PROCS(void){

 return &procsPPM;

 }

 

Zurück Weiter