|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 6652 (0x19fc) Types: TextFile Names: »image.c++«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/image/varc++/image.c++«
/* This file contains the implementation of the generic image stuff except for handling the and read and write function that requires knowledge of the image file format */ #include <stream.h> #include <stdio.h> #include <string.h> #include "for.h++" #include "image.h++" /* initializer for generic images when image is being created rather than read from file */ image_class::image_class ( const create_image_type cit, // maker that the image is being created const FILE * image_file , // the file for the image const card n_rows , // the number of rows in the image const card n_cols , // the number of collumns in the image const card w_width , // the width of the window const card w_length // the length of the window ) { /* check that the constructor is called correctly */ if ( cit != CREATE ) { cerr << "Generic constructor for image being called in obscure way\n"; abort(); } /* initialize using arguments */ file = image_file; number_rows = n_rows; number_cols = n_cols; window_width = w_width; window_length = w_length; /* a priori initializations */ /* status */ image_status = UNINITIALIZED; window_status = UNINITIALIZED; prot = CAN_NOT_DO_ANYTHING; /* comments */ comment_length = 0; comments = NULL; /* header info from file format */ header_info = NULL; } /* comment manipulation code */ /* returns a null terminated string for comments */ const char * comment_string ( image_class& i ) { char * output = new char [ i.comment_length + 1 ]; // output for the data char * output_p = output; // pointer to output const char * com = i.comments; // comments /* copy the comments into the new string */ FOR(int i1 = 0 ; i1 < i.comment_length ; i1++) { *(output_p++) = *(com++); } ENDFOR /* null terminate the new string */ *output_p = '\0'; /* return the new string */ return output; } /* sets the comments */ void image_class::set_comments( char * string , const card length ) { comment_length = length; comments = string; } /* adds a string to the comments */ void image_class::add_comment( char * string , const card length ) { /* the new comments to be used */ char * new_comments = new char [ comment_length + length ]; char * ncp = new_comments; // pointer into new comments char * ocp = comments; // pointer into old comments /* copy the old comments into the new string */ FOR(int i1 = 0 ; i1 < comment_length ; i1++) { *(ncp++) = *(ocp++); } ENDFOR /* copy the added comments into the new string */ FOR(int i1 = 0 ; i1 < length ; i1++) { *(ncp++) = *(string++); } ENDFOR /* make the new string the comments */ comment_length += length; comments = new_comments; } /* for moving around in images */ /* move to specified row */ void image_class::move_to_row ( const card n ) { // test bounds if ( n < 0 ) { cerr << "Trying to move to a negative row in an image\n"; cerr << "The row is " << n << "\n"; abort(); } if ( n + window_length > number_rows ) { cerr << "Trying to move to a nonexistant row in an image\n"; cerr << "The row is " << n << "\n"; abort(); } // check status if ( window_status == UNINITIALIZED ) { // check collumn boundaries if ( window_width > number_cols ) { cerr << "Window to wide for image!\n"; cerr << "Width of image: " << number_cols; cerr << "Width of window: " << window_width; cerr << "\n"; abort(); } row = n; collumn = 0; window_status = INITIALIZED; } // otherwise change the row since it is legal row = n; } /* move to specified collumn */ void image_class::move_to_collumn ( const card n ) { // test bounds if ( n < 0 ) { cerr << "Trying to move to a negative collumn in an image\n"; cerr << "The collumn is " << n << "\n"; abort(); } if ( n + window_width > number_cols ) { cerr << "Trying to move to a nonexistant collumn in an image\n"; cerr << "The collumn is " << n << "\n"; abort(); } // check status if ( window_status == UNINITIALIZED ) { // check collumn boundaries if ( window_length > number_rows ) { cerr << "Window to long for image!\n"; cerr << "Height of image: " << number_rows; cerr << "Height of window: " << window_length; cerr << "\n"; abort(); } collumn = n; row = 0; window_status = INITIALIZED; } // otherwise change the row since it is legal collumn = n; } /* move in row n steps returns 1 when that motion is legal 0 otherwise */ int image_class::move_collumn ( const int n ) { // check the status of the window if ( window_status == UNINITIALIZED ) { // it is probably an error so print an error message cerr << "trying to move in unitialized window\n"; // but return 0 since that is the semantics return 0; } // check that the movement doesn't lead to a negative position if ( n + collumn < 0 ) { return 0; } // check that the movement doesn't lead to a too large position if ( n + collumn + window_width > number_rows ) { return 0; } // else increment the collumn position and return successfully collumn += n; return 1; } /* move in collumn n steps returns 1 when that motion is legal 0 otherwise */ int image_class::move_row ( const int n ) { // check the status of the window if ( window_status == UNINITIALIZED ) { // it is probably an error so print an error message cerr << "trying to move in unitialized window\n"; // but return 0 since that is the semantics return 0; } // check that the movement doesn't lead to a negative position if ( n + row < 0 ) { return 0; } // check that the movement doesn't lead to a too large position if ( n + row + window_width > number_cols ) { return 0; } // else increment the collumn position and return successfully row += n; return 1; } /* change the protection from CAN_WRITE to CAN_READ_AND_WRITE */ void image_class::read_and_write ( ) { if ( prot == CAN_WRITE ) { prot = CAN_READ_AND_WRITE; } else { cerr << "Protection violation for read_and_write\n"; abort(); } } /* Copyright (C) 1986, David Sher in the University of Rochester Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */