------------------------------------------------------------------ -- -- NAME: GKS_NORMALIZATION - BODY -- DISCREPANCY REPORTS: ------------------------------------------------------------------ -- file: gks_norm_b.ada -- level: 0a, 1a, 2a, 0b, 1b, 2b, 0c, 1c, 2c with CGI_SUBTYPES_A; with WSM; with ERROR_HANDLING; with GKS_DESCRIPTION_TABLE; with GKS_OPERATING_STATE_LIST; with GKS_STATE_LIST; with GKS_ERRORS; with TRANSLATION_FACTORS; with SET_PRIMITIVE_ATTRIBUTES_MA; with SET_PRIMITIVE_ATTRIBUTES_0A; with GKS_ERROR_STATE_LIST; use CGI_SUBTYPES_A; use WSM; use GKS_ERROR_STATE_LIST; use GKS_OPERATING_STATE_LIST; use GKS_ERRORS; package body GKS_NORMALIZATION is -- This is the package body for the normalization transformation -- procedures for GKS. -- -- Each of the procedures in this package inquires the -- GKS_OPERATING_STATE_LIST to check if GKS is in one -- of the states GKOP, WSOP, WSAC, or SGOP. If it is not, -- error 8 occurs and the procedure calls ERROR_HANDLING. -- -- If an error indicator above 0 occurs, these procedures call -- the ERROR_HANDLING procedure. procedure SET_WINDOW (TRANSFORMATION : in POSITIVE_TRANSFORMATION_NUMBER; WINDOW_LIMITS : in WC.RECTANGLE_LIMITS) is -- This procedure checks to see if the transformation number is -- greater or equal to 1. If it is not, error 50 occurs and the -- procedure ERROR_HANDLING is called. Then, this -- procedure checks the value of the window limits passed -- in to see if they are valid. If not, error 51 occurs and the -- procedure ERROR_HANDLING is called. Otherwise, the -- procedure sets the value of the window limits entry for the -- specified transformation number in the GKS_STATE_LIST. -- -- TRANSFORMATION - This is an integer value representing a -- normalization transformation. -- WINDOW_LIMITS - This record defines the extent of the -- window RECTANGLE_LIMITS in world coordinates. Its X and Y -- components give the limits in relation to the x and y -- axes. PATTERN_SIZE : WC.SIZE; -- This object is used to store the current pattern size as -- it is converted from height and width vectors in the GKS_STATE_ -- LIST. It is then used as the actual parameter in the -- SET_PATTERN_SIZE call. begin -- Check the GKS_ERROR_STATE_LIST to see that the ERROR_STATE -- is not ON before continuing. if GKS_ERROR_STATE_LIST.ERROR_STATE = ON then return; end if; -- The following if structure inquires the GKS_OPERATING_ -- STATE_LIST to see if GKS is in the proper state and if -- the window limits requested are valid before proceeding -- with the set to the GKS_STATE_LIST. if CURRENT_OPERATING_STATE = GKCL then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (NOT_GKOP_WSOP_WSAC_SGOP,"SET_WINDOW");-- Error 8 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; elsif (TRANSFORMATION < 1) or (TRANSFORMATION > GKS_DESCRIPTION_TABLE.MAX_NORMALIZATION_TRANSFORMATION_NUMBER) then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (INVALID_XFORM_NUMBER,"SET_WINDOW"); -- Error 50 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; elsif (WINDOW_LIMITS.XMIN >= WINDOW_LIMITS.XMAX) or (WINDOW_LIMITS.YMIN >= WINDOW_LIMITS.YMAX) then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (INVALID_RECTANGLE, "SET_WINDOW"); -- Error 51 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; else GKS_STATE_LIST.LIST_OF_NORMALIZATION_TRANSFORMATIONS (TRANSFORMATION).WINDOW := WINDOW_LIMITS; GKS_STATE_LIST.LIST_OF_NORMALIZATION_TRANSFORMATIONS (TRANSFORMATION).NDC_FACTORS := TRANSLATION_FACTORS. GET_NORMALIZATION_FACTORS(WINDOW_LIMITS,GKS_STATE_LIST. LIST_OF_NORMALIZATION_TRANSFORMATIONS(TRANSFORMATION). VIEWPORT); GKS_STATE_LIST.LIST_OF_NORMALIZATION_TRANSFORMATIONS (TRANSFORMATION).WC_FACTORS := TRANSLATION_FACTORS. GET_NORMALIZATION_FACTORS(GKS_STATE_LIST. LIST_OF_NORMALIZATION_TRANSFORMATIONS(TRANSFORMATION). VIEWPORT,WINDOW_LIMITS); end if; -- The following procedure calls ensure that the primitive -- attributes that are affected by the new window are reset. SET_PRIMITIVE_ATTRIBUTES_MA.SET_CHAR_HEIGHT(GKS_STATE_LIST. CURRENT_CHAR_HEIGHT); SET_PRIMITIVE_ATTRIBUTES_MA.SET_CHAR_UP_VECTOR(GKS_STATE_LIST. CURRENT_CHAR_UP_VECTOR); PATTERN_SIZE := (XAXIS => WC.MAGNITUDE(GKS_STATE_LIST. CURRENT_PATTERN_WIDTH_VECTOR.X), YAXIS => WC.MAGNITUDE(GKS_STATE_LIST. CURRENT_PATTERN_HEIGHT_VECTOR.Y)); SET_PRIMITIVE_ATTRIBUTES_0A.SET_PATTERN_SIZE(PATTERN_SIZE); SET_PRIMITIVE_ATTRIBUTES_0A.SET_PATTERN_REFERENCE_POINT (GKS_STATE_LIST.CURRENT_PATTERN_REFERENCE_POINT); exception when GKS_ERROR => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; when OTHERS => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (UNKNOWN, "SET_WINDOW"); -- Error 2501 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when OTHERS => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; end SET_WINDOW; procedure SET_VIEWPORT (TRANSFORMATION : in POSITIVE_TRANSFORMATION_NUMBER; VIEWPORT_LIMITS : in NDC.RECTANGLE_LIMITS) is -- If the transformation number is less than 1, error 50 -- occurs, and the procedure ERROR_HANDLING is called. -- Then, this procedure checks if the rectangle definition of -- the viewport limits passed in is valid. If it is not, -- error 51 occurs and the procedure calls ERROR_HANDLING. -- If the rectangle is not with in NDC unit square, error -- 52 occurs and the procedure ERROR_HANDLING is called. -- -- The viewport limits entry of the specified normalization -- transformation in the GKS_STATE_LIST is set to the value -- passed in. -- -- This procedure also passes the information to the WS_MANAGER -- so that it will have access to the new viewport specification. -- -- TRANSFORMATION - This is an integer value representing a -- normalization transformation. -- VEIWPORT_LIMITS - This record defines the extent of the -- viewport rectangle in normalized device coordinates. -- Its X and Y components give the limits in relation to -- the x and y axes. GKS_INSTR : CGI_SET_CLIPPING_RECTANGLE; PATTERN_SIZE : WC.SIZE; -- This object is used to store the current pattern size as -- it is converted from height and width vectors in the GKS_STATE_ -- LIST. It is then used as the actual parameter in the -- SET_PATTERN_SIZE call. begin -- Check the GKS_ERROR_STATE_LIST to see that the ERROR_STATE -- is not ON before continuing. if GKS_ERROR_STATE_LIST.ERROR_STATE = ON then return; end if; -- The following if structure inquires the GKS_OPERATING_ -- STATE_LIST to see if GKS is in the proper state. It then -- checks the TRANSFORMATION parameter to ensure that it is -- not less than 1. Then it checks the validity of the VIEW- -- PORT_LIMITS passed in. This is done by checking the -- rectangle values and by checking to see if the viewport -- is in the NDC unit square. If all of the checks are -- satisfactory, the viewport is set. if CURRENT_OPERATING_STATE = GKCL then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (NOT_GKOP_WSOP_WSAC_SGOP,"SET_VIEWPORT");-- Error 8 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; elsif (TRANSFORMATION < 1) or (TRANSFORMATION > GKS_DESCRIPTION_TABLE.MAX_NORMALIZATION_TRANSFORMATION_NUMBER) then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (INVALID_XFORM_NUMBER, "SET_VIEWPORT");-- Error 50 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; elsif (VIEWPORT_LIMITS.XMIN >= VIEWPORT_LIMITS.XMAX) or (VIEWPORT_LIMITS.YMIN >= VIEWPORT_LIMITS.YMAX) then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (INVALID_RECTANGLE, "SET_VIEWPORT"); -- Error 51 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; elsif (VIEWPORT_LIMITS.XMIN < 0.0) or (VIEWPORT_LIMITS.XMAX > 1.0) or (VIEWPORT_LIMITS.YMIN < 0.0) or (VIEWPORT_LIMITS.YMAX > 1.0) then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (VIEWPORT_NOT_IN_NDC_UNIT_SQR, "SET_VIEWPORT"); -- Error 52 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; else if (TRANSFORMATION = GKS_STATE_LIST. CURRENT_NORMALIZATION_TRANSFORMATION) then GKS_STATE_LIST.CLIPPING_RECTANGLE := VIEWPORT_LIMITS; if (GKS_STATE_LIST.CLIP_INDICATOR = CLIP) then GKS_INSTR.CLIPPING_RECTANGLE_SET := VIEWPORT_LIMITS; WS_MANAGER (GKS_INSTR); end if; end if; GKS_STATE_LIST.LIST_OF_NORMALIZATION_TRANSFORMATIONS (TRANSFORMATION).VIEWPORT := VIEWPORT_LIMITS; GKS_STATE_LIST.LIST_OF_NORMALIZATION_TRANSFORMATIONS (TRANSFORMATION).NDC_FACTORS := TRANSLATION_FACTORS. GET_NORMALIZATION_FACTORS(GKS_STATE_LIST. LIST_OF_NORMALIZATION_TRANSFORMATIONS(TRANSFORMATION). WINDOW,VIEWPORT_LIMITS); GKS_STATE_LIST.LIST_OF_NORMALIZATION_TRANSFORMATIONS (TRANSFORMATION).WC_FACTORS := TRANSLATION_FACTORS. GET_NORMALIZATION_FACTORS(VIEWPORT_LIMITS,GKS_STATE_LIST. LIST_OF_NORMALIZATION_TRANSFORMATIONS(TRANSFORMATION). WINDOW); end if; -- The following procedure calls ensure that the primitive -- attributes that are affected by the new viewport are reset. SET_PRIMITIVE_ATTRIBUTES_MA.SET_CHAR_HEIGHT(GKS_STATE_LIST. CURRENT_CHAR_HEIGHT); SET_PRIMITIVE_ATTRIBUTES_MA.SET_CHAR_UP_VECTOR(GKS_STATE_LIST. CURRENT_CHAR_UP_VECTOR); PATTERN_SIZE := (XAXIS => WC.MAGNITUDE(GKS_STATE_LIST. CURRENT_PATTERN_WIDTH_VECTOR.X), YAXIS => WC.MAGNITUDE(GKS_STATE_LIST. CURRENT_PATTERN_HEIGHT_VECTOR.Y)); SET_PRIMITIVE_ATTRIBUTES_0A.SET_PATTERN_SIZE(PATTERN_SIZE); SET_PRIMITIVE_ATTRIBUTES_0A.SET_PATTERN_REFERENCE_POINT (GKS_STATE_LIST.CURRENT_PATTERN_REFERENCE_POINT); exception when GKS_ERROR => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; when NUMERIC_ERROR | CONSTRAINT_ERROR => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (ARITHMETIC, "SET_VIEWPORT"); -- Error 308 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when OTHERS => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; when OTHERS => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (UNKNOWN, "SET_VIEWPORT"); -- Error 2501 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when OTHERS => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; end SET_VIEWPORT; procedure SELECT_NORMALIZATION_TRANSFORMATION (TRANSFORMATION : in TRANSFORMATION_NUMBER) is -- The current normalization transformation number entry in the -- GKS_STATE_LIST is set to the value that was passed in. -- Also, if the clipping indicator is on in the GKS_STATE_LIST, -- the procedure passes the clipping rectangle (viewport) of the -- normalization transformation to the WS_MANAGER. -- -- TRANSFORMATION - This is an integer value representing a -- normalization transformation. GKS_INSTR : CGI_SET_CLIPPING_RECTANGLE; PATTERN_SIZE : WC.SIZE; -- This object is used to store the current pattern size as -- it is converted from height and width vectors in the GKS_STATE_ -- LIST. It is then used as the actual parameter in the -- SET_PATTERN_SIZE call. begin -- Check the GKS_ERROR_STATE_LIST to see that the ERROR_STATE -- is not ON before continuing. if GKS_ERROR_STATE_LIST.ERROR_STATE = ON then return; end if; -- The following if inquires the GKS_OPERATING_STATE_LIST -- to see if GKS is in the proper state before proceeding -- with the set to the GKS_STATE_LIST. if CURRENT_OPERATING_STATE = GKCL then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (NOT_GKOP_WSOP_WSAC_SGOP, "SELECT_NORMALIZATION_TRANSFORMATION"); -- Error 8 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; elsif (TRANSFORMATION > GKS_STATE_LIST.LIST_OF_NORMALIZATION_TRANSFORMATIONS'LAST) then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (INVALID_XFORM_NUMBER, "SELECT_NORMALIZATION_TRANFORMATION"); -- Error 50 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; else if (TRANSFORMATION /= GKS_STATE_LIST. CURRENT_NORMALIZATION_TRANSFORMATION) and (GKS_STATE_LIST.CLIP_INDICATOR = CLIP) then GKS_INSTR.CLIPPING_RECTANGLE_SET := GKS_STATE_LIST. LIST_OF_NORMALIZATION_TRANSFORMATIONS (TRANSFORMATION).VIEWPORT; WS_MANAGER(GKS_INSTR); end if; GKS_STATE_LIST.CURRENT_NORMALIZATION_TRANSFORMATION := TRANSFORMATION; GKS_STATE_LIST.CLIPPING_RECTANGLE := GKS_STATE_LIST. LIST_OF_NORMALIZATION_TRANSFORMATIONS(TRANSFORMATION). VIEWPORT; -- The following procedure calls ensure that the primitive -- attributes that are affected by the new viewport are reset. SET_PRIMITIVE_ATTRIBUTES_MA.SET_CHAR_HEIGHT(GKS_STATE_LIST. CURRENT_CHAR_HEIGHT); SET_PRIMITIVE_ATTRIBUTES_MA.SET_CHAR_UP_VECTOR(GKS_STATE_LIST. CURRENT_CHAR_UP_VECTOR); PATTERN_SIZE := (XAXIS => WC.MAGNITUDE(GKS_STATE_LIST. CURRENT_PATTERN_WIDTH_VECTOR.X), YAXIS => WC.MAGNITUDE(GKS_STATE_LIST. CURRENT_PATTERN_HEIGHT_VECTOR.Y)); SET_PRIMITIVE_ATTRIBUTES_0A.SET_PATTERN_SIZE(PATTERN_SIZE); SET_PRIMITIVE_ATTRIBUTES_0A.SET_PATTERN_REFERENCE_POINT (GKS_STATE_LIST.CURRENT_PATTERN_REFERENCE_POINT); end if; exception when GKS_ERROR => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; when NUMERIC_ERROR | CONSTRAINT_ERROR => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (ARITHMETIC, "SELECT_NORMALIZATION_TRANSFORMATION"); GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when OTHERS => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; when OTHERS => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (UNKNOWN, "SELECT_NORMALIZATION_TRANSFORMATION"); GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when OTHERS => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; end SELECT_NORMALIZATION_TRANSFORMATION; procedure SET_CLIPPING_INDICATOR (CLIPPING : in CLIPPING_INDICATOR) is -- This procedure sets the clipping indicator in the GKS_STATE_LIST. -- If the indicator is turned OFF, the clipping rectangle of -- (0.0,1.0,0.0,1.0) is passed to the WS_MANAGER. If it is turned -- ON, the viewport is sent to the WS_MANAGER. -- -- CLIPPING - The value of this enumerated parameter may be CLIP -- or NOCLIP. Its value determines whether or not clipping -- will be performed on successive output. GKS_INSTR : CGI_SET_CLIPPING_RECTANGLE; begin -- Check the GKS_ERROR_STATE_LIST to see that the ERROR_STATE -- is not ON before continuing. if GKS_ERROR_STATE_LIST.ERROR_STATE = ON then return; end if; -- The following if inquires the GKS_OPERATING_STATE_LIST -- to see if GKS is in the proper state before proceeding -- with the call to the WS_MANAGER. if CURRENT_OPERATING_STATE = GKCL then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (NOT_GKOP_WSOP_WSAC_SGOP, "SET_CLIPPING_INDICATOR"); -- Error 8 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; else if GKS_STATE_LIST.CLIP_INDICATOR /= CLIPPING then GKS_STATE_LIST.CLIP_INDICATOR := CLIPPING; end if; -- Call to the WS_MANAGER. if CLIPPING = CLIP then GKS_INSTR.CLIPPING_RECTANGLE_SET := GKS_STATE_LIST. CLIPPING_RECTANGLE; WS_MANAGER (GKS_INSTR); elsif CLIPPING = NOCLIP then GKS_INSTR.CLIPPING_RECTANGLE_SET := GKS_STATE_LIST. LIST_OF_NORMALIZATION_TRANSFORMATIONS (0).VIEWPORT; WS_MANAGER (GKS_INSTR); end if; end if; exception when GKS_ERROR => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; when NUMERIC_ERROR | CONSTRAINT_ERROR => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (ARITHMETIC,"SET_CLIPPING_INDICATOR"); GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when OTHERS => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; when OTHERS => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (UNKNOWN,"SET_CLIPPING_INDICATOR");-- Error 2501 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when OTHERS => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; end SET_CLIPPING_INDICATOR; end GKS_NORMALIZATION;