[gs-cvs] rev 8079 - trunk/gs/src

leonardo at ghostscript.com leonardo at ghostscript.com
Tue Jun 26 13:43:03 PDT 2007


Author: leonardo
Date: 2007-06-26 13:43:03 -0700 (Tue, 26 Jun 2007)
New Revision: 8079

Modified:
   trunk/gs/src/gxcldev.h
   trunk/gs/src/gxclimag.c
   trunk/gs/src/gxclrect.c
Log:
Fix : Expanding gxcldev.h macros, part 2.

DETAILS :

This change is algorithmically equivalent.
The purpose is to eliminate gxcldev.h macros
to simplify the debugging of the clist writer methods.

This 2nd step replaces HANDLE_RECT_UNLESS
with macros that don't include goto or return statements.

Besides that, the pattern :

		if (code < 0) {
		    band_code = code;
		    goto error_in_rect; /* ERROR_RECT(code); */
 		}

is replaced with the smaller one :

		if (code < 0 && SET_BAND_CODE(code))
		    goto error_in_rect;

for a better readability.

Some compilers may claim unreferenced label error_in_rect.
To be fixed in the next step.

EXPECTED DIFFERENCES :

None.


Modified: trunk/gs/src/gxcldev.h
===================================================================
--- trunk/gs/src/gxcldev.h	2007-06-26 16:25:42 UTC (rev 8078)
+++ trunk/gs/src/gxcldev.h	2007-06-26 20:43:03 UTC (rev 8079)
@@ -576,17 +576,10 @@
 	    height = min(band_end, yend) - y;\
 retry_rect:\
 	    ;
-#define TRY_RECT\
-		    do
-#define HANDLE_RECT_UNLESS(codevar, unless_clause)\
-		    while (codevar < 0 &&\
-			   (codevar = clist_VMerror_recover(cdev, codevar)) >= 0\
-			   );\
-		    if (codevar < 0 && !(unless_clause))\
-			BEGIN\
-			    band_code = (codevar);\
-			    goto error_in_rect;\
-			END;
+
+#define RECT_RECOVER(codevar) (codevar < 0 && (codevar = clist_VMerror_recover(cdev, codevar)) >= 0)
+#define SET_BAND_CODE(codevar) (band_code = codevar)
+
 #define END_RECTS_ON_ERROR(retry_cleanup, is_error, after_recovering)\
 	    continue;\
 error_in_rect:\
@@ -594,8 +587,7 @@
 		    retry_cleanup;\
 		    if ((is_error) &&\
 			cdev->driver_call_nesting == 0 &&\
-			(band_code =\
-			 clist_VMerror_recover_flush(cdev, band_code)) >= 0 &&\
+			SET_BAND_CODE(clist_VMerror_recover_flush(cdev, band_code)) >= 0 &&\
 			(after_recovering)\
 			)\
 			goto retry_rect;\

Modified: trunk/gs/src/gxclimag.c
===================================================================
--- trunk/gs/src/gxclimag.c	2007-06-26 16:25:42 UTC (rev 8078)
+++ trunk/gs/src/gxclimag.c	2007-06-26 20:43:03 UTC (rev 8079)
@@ -108,28 +108,40 @@
 	int code;
         ulong offset_temp;
 
-	TRY_RECT {
+	do {
 	    code = cmd_update_lop(cdev, pcls, lop);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	if (depth > 1 && !pcls->color_is_alpha) {
 	    byte *dp;
 
-	    TRY_RECT {
+	    do {
 		code =
 		    set_cmd_put_op(dp, cdev, pcls, cmd_opv_set_copy_alpha, 1);
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    pcls->color_is_alpha = 1;
 	}
-	TRY_RECT {
+	do {
 	    code = cmd_do_write_unknown(cdev, pcls, clip_path_known);
 	    if (code >= 0)
 		code = cmd_do_enable_clip(cdev, pcls, pcpath != NULL);
-	} HANDLE_RECT_UNLESS(code, 0);
-	TRY_RECT {
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
+	do {
 	    code = cmd_put_drawing_color(cdev, pcls, pdcolor);
 	    if (depth > 1 && code >= 0)
 		code = cmd_set_color1(cdev, pcls, pdcolor->colors.pure);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	pcls->colors_used.slow_rop |= slow_rop;
 	pcls->band_complexity.nontrivial_rops |= slow_rop;
 	pcls->band_complexity.uses_color |= (pdcolor->colors.pure != 0 && pdcolor->colors.pure != 0xffffff);
@@ -143,10 +155,12 @@
 	    tile.size.y = tile.rep_height = orig_height;
 	    tile.rep_shift = tile.shift = 0;
 	    tile.id = id;
-	    TRY_RECT {
+	    do {
 	        code = clist_change_bits(cdev, pcls, &tile, depth);
-	    } HANDLE_RECT_UNLESS(code,
-	        (code != gs_error_VMerror || !cdev->error_is_retryable) );
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, (code != gs_error_VMerror || !cdev->error_is_retryable) ); */
+	    if (code < 0 && !(code != gs_error_VMerror || !cdev->error_is_retryable) && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    if (code < 0) {
 	        /* Something went wrong; just copy the bits. */
 	        goto copy;
@@ -162,7 +176,7 @@
 	    rect.x = orig_x, rect.y = y0;
 	    rect.width = orig_width, rect.height = yend - y0;
 	    rsize = 1 + cmd_sizexy(rect);
-	    TRY_RECT {
+	    do {
 	        code = (orig_data_x ?
 	      		cmd_put_set_data_x(cdev, pcls, orig_data_x) : 0);
 		if (code >= 0) {
@@ -182,7 +196,10 @@
 		        cmd_putxy(rect, dp);
 		    }
 		}
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    pcls->rect = rect;
 	    goto end;
 	}
@@ -656,7 +673,7 @@
 	    byte image_op = cmd_opv_begin_image;
 
 	    /* Make sure the imager state is up to date. */
-	    TRY_RECT {
+	    do {
 	        code = (pie->color_map_is_known ? 0 :
 			cmd_put_color_mapping(cdev, pie->pis));
 		pie->color_map_is_known = true;
@@ -673,11 +690,17 @@
 		    code = cmd_do_enable_clip(cdev, pcls, pie->pcpath != NULL);
 		if (code >= 0)
 		    code = cmd_update_lop(cdev, pcls, lop);
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    if (pie->uses_color) {
- 	        TRY_RECT {
+ 	        do {
 		    code = cmd_put_drawing_color(cdev, pcls, &pie->dcolor);
-		} HANDLE_RECT_UNLESS(code, 0);
+		} while (RECT_RECOVER(code));
+		/* HANDLE_RECT_UNLESS(code, 0); */
+		if (code < 0 && SET_BAND_CODE(code))
+		    goto error_in_rect;
 	    }
 	    if (entire_box.p.x != 0 || entire_box.p.y != 0 ||
 		entire_box.q.x != pie->image.Width ||
@@ -689,10 +712,13 @@
 			  pie->image.Height - entire_box.q.y, bp);
  	        }
 	    len = bp - pie->begin_image_command;
-	    TRY_RECT {
+	    do {
 		code =
 		    set_cmd_put_op(dp, cdev, pcls, image_op, 1 + len);
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    memcpy(dp + 1, pie->begin_image_command, len);
  
 	    /* Mark band's begin_image as known */
@@ -743,18 +769,21 @@
 	    }
 	    for (iy = by0, ih = by1 - by0; ih > 0; iy += nrows, ih -= nrows) {
 		nrows = min(ih, rows_per_cmd);
-		TRY_RECT {
+		do {
 		    code = cmd_image_plane_data(cdev, pcls, planes, info,
 						bytes_per_plane, offsets,
 						xoff - xskip, nrows);
-		} HANDLE_RECT_UNLESS(code, 0);
+		} while (RECT_RECOVER(code));
+		/* HANDLE_RECT_UNLESS(code, 0); */
+		if (code < 0 && SET_BAND_CODE(code))
+		    goto error_in_rect;
 		for (i = 0; i < num_planes; ++i)
 		    offsets[i] += planes[i].raster * nrows;
 	    }
 	}
     } END_RECTS_ON_ERROR(
 	code = clist_image_plane_data_retry_cleanup(dev, pie, yh_used, code),
-	(code < 0 ? (band_code = code) : code) >= 0,
+	(code < 0 ? SET_BAND_CODE(code) : code) >= 0,
 	(cmd_clear_known(cdev,
 			 clist_image_unknowns(dev, pie) | begin_image_known),
 	 pie->color_map_is_known = false,
@@ -1438,10 +1467,13 @@
 
 	if (!(pcls->known & begin_image_known))
 	    continue;
-	TRY_RECT {
+	do {
 	    if_debug1('L', "[L]image_end for band %d\n", band);
 	    code = set_cmd_put_op(dp, cdev, pcls, cmd_opv_image_data, 2);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	dp[1] = 0;	    /* EOD */
 	pcls->known ^= begin_image_known;
     } END_RECTS;

Modified: trunk/gs/src/gxclrect.c
===================================================================
--- trunk/gs/src/gxclrect.c	2007-06-26 16:25:42 UTC (rev 8078)
+++ trunk/gs/src/gxclrect.c	2007-06-26 20:43:03 UTC (rev 8079)
@@ -148,7 +148,7 @@
     FOR_RECTS {
 	pcls->colors_used.or |= color;
 	pcls->band_complexity.uses_color |= ((color != 0xffffff) && (color != 0)); 
-	TRY_RECT {
+	do {
 	    code = cmd_disable_lop(cdev, pcls);
 	    if (code >= 0 && color != pcls->colors[1])
 		code = cmd_put_color(cdev, pcls, &clist_select_color1,
@@ -156,7 +156,10 @@
 	    if (code >= 0)
 		code = cmd_write_rect_cmd(cdev, pcls, cmd_op_fill_rect, x, y,
 					  width, height);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
     } END_RECTS;
     return 0;
 }
@@ -190,16 +193,21 @@
 	    ((color0 != gx_no_color_index) && (color0 != 0xffffff) && (color0 != 0)) ||
 	    ((color1 != gx_no_color_index) && (color1 != 0xffffff) && (color1 != 0));
 
-	TRY_RECT {
+	do {
 	    code = cmd_disable_lop(cdev, pcls);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	if (!cls_has_tile_id(cdev, pcls, tile->id, offset_temp)) {
 	    code = 0;
 	    if (tile->id != gx_no_bitmap_id) {
-		TRY_RECT {
+		do {
 		    code = clist_change_tile(cdev, pcls, tile, depth);
-		} HANDLE_RECT_UNLESS(code,
-		    (code != gs_error_VMerror || !cdev->error_is_retryable));
+		} while (RECT_RECOVER(code));
+		/* HANDLE_RECT_UNLESS(code, (code != gs_error_VMerror || !cdev->error_is_retryable)); */
+		if (code < 0 && !(code != gs_error_VMerror || !cdev->error_is_retryable) && SET_BAND_CODE(code))
+		    goto error_in_rect;
 	    }
 	    if (code < 0) {
 		/* ok if gx_default... does retries internally: */
@@ -208,14 +216,12 @@
 						       x, y, width, height,
 						       color0, color1,
 						       px, py);
-		if (code < 0) {
-		    band_code = code;
-		    goto error_in_rect; /* ERROR_RECT(code); */
-		}
+		if (code < 0 && SET_BAND_CODE(code))
+		    goto error_in_rect;
 		goto endr;
 	    }
 	}
-	TRY_RECT {
+	do {
 	    code = 0;
 	    if (color0 != pcls->tile_colors[0] || color1 != pcls->tile_colors[1])
 		code = cmd_set_tile_colors(cdev, pcls, color0, color1);
@@ -226,7 +232,10 @@
 	    if (code >= 0)
 		code = cmd_write_rect_cmd(cdev, pcls, cmd_op_tile_rect, x, y,
 					  width, height);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 endr:;
     } END_RECTS;
     return 0;
@@ -263,7 +272,7 @@
 	pcls->colors_used.or |= colors_used;
 	pcls->band_complexity.uses_color |= uses_color;
 
-	TRY_RECT {
+	do {
 	    code = cmd_disable_lop(cdev, pcls);
 	    if (code >= 0)
 		code = cmd_disable_clip(cdev, pcls);
@@ -271,7 +280,10 @@
 		code = cmd_set_color0(cdev, pcls, color0);
 	    if (color1 != pcls->colors[1] && code >= 0)
 		code = cmd_set_color1(cdev, pcls, color1);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	/* Don't bother to check for a possible cache hit: */
 	/* tile_rectangle and fill_mask handle those cases. */
 copy:{
@@ -286,13 +298,16 @@
 	rect.x = x, rect.y = y;
 	rect.width = w1, rect.height = height;
 	rsize = (dx ? 3 : 1) + cmd_size_rect(&rect);
-	TRY_RECT {
+	do {
 	    code = cmd_put_bits(cdev, pcls, row, w1, height, raster,
 				rsize, (orig_id == gx_no_bitmap_id ?
 					1 << cmd_compress_rle :
 					cmd_mask_compress_any),
 				&dp, &csize);
-	} HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck); */
+	if (code < 0 && !(code == gs_error_limitcheck) && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	compress = (uint)code;
 	if (code < 0) {
 	    /* The bitmap was too large; split up the transfer. */
@@ -319,10 +334,8 @@
 					       w1 - w2, 1, color0, color1);
 		} 
 		--cdev->driver_call_nesting; /* UNNEST_RECT */
-		if (code < 0) {
-		    band_code = code;
-		    goto error_in_rect; /* ERROR_RECT(code); */
-		}
+		if (code < 0 && SET_BAND_CODE(code))
+		    goto error_in_rect;
 		continue;
 	    }
 	}
@@ -367,18 +380,24 @@
 	pcls->colors_used.or |= colors_used;
 	pcls->band_complexity.uses_color = 1;
 
-	TRY_RECT {
+	do {
 	    code = cmd_disable_lop(cdev, pcls);
 	    if (code >= 0)
 		code = cmd_disable_clip(cdev, pcls);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	if (pcls->color_is_alpha) {
 	    byte *dp;
 
-	    TRY_RECT {
+	    do {
 		code =
 		    set_cmd_put_op(dp, cdev, pcls, cmd_opv_set_copy_color, 1);
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    pcls->color_is_alpha = 0;
 	}
 copy:{
@@ -392,11 +411,14 @@
 	    rect.x = x, rect.y = y;
 	    rect.width = w1, rect.height = height;
 	    rsize = (dx ? 3 : 1) + cmd_size_rect(&rect);
-	    TRY_RECT {
+	    do {
 		code = cmd_put_bits(cdev, pcls, row, w1 * depth,
 				    height, raster, rsize,
 				    1 << cmd_compress_rle, &dp, &csize);
-	    } HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck); */
+	    if (code < 0 && !(code == gs_error_limitcheck) && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    compress = (uint)code;
 	    if (code < 0) {
 		/* The bitmap was too large; split up the transfer. */
@@ -421,10 +443,8 @@
 						    x + w2, y, w1 - w2, 1);
 		    } 
 		    --cdev->driver_call_nesting; /* UNNEST_RECT */
-		    if (code < 0) {
-			band_code = code;
-			goto error_in_rect; /* ERROR_RECT(code); */
-		    }
+		    if (code < 0 && SET_BAND_CODE(code))
+			goto error_in_rect;
 		    continue;
 		}
 	    }
@@ -473,24 +493,33 @@
 	int code;
 
 	pcls->colors_used.or |= color;
-	TRY_RECT {
+	do {
 	    code = cmd_disable_lop(cdev, pcls);
 	    if (code >= 0)
 		code = cmd_disable_clip(cdev, pcls);
-	} HANDLE_RECT_UNLESS(code, 0);
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	if (!pcls->color_is_alpha) {
 	    byte *dp;
 
-	    TRY_RECT {
+	    do {
 		code =
 		    set_cmd_put_op(dp, cdev, pcls, cmd_opv_set_copy_alpha, 1);
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    pcls->color_is_alpha = 1;
 	}
 	if (color != pcls->colors[1]) {
-	    TRY_RECT {
+	    do {
 		code = cmd_set_color1(cdev, pcls, color);
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	}
 copy:{
 	    gx_cmd_rect rect;
@@ -503,11 +532,14 @@
 	    rect.x = x, rect.y = y;
 	    rect.width = w1, rect.height = height;
 	    rsize = (dx ? 4 : 2) + cmd_size_rect(&rect);
-	    TRY_RECT {
+	    do {
 		code = cmd_put_bits(cdev, pcls, row, w1 << log2_depth,
 				    height, raster, rsize,
 				    1 << cmd_compress_rle, &dp, &csize);
-	    } HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck); */
+	    if (code < 0 && !(code == gs_error_limitcheck) && SET_BAND_CODE(code))
+		goto error_in_rect;
 	    compress = (uint)code;
 	    if (code < 0) {
 		/* The bitmap was too large; split up the transfer. */
@@ -533,10 +565,8 @@
 						    color, depth);
 		    } 
 		    --cdev->driver_call_nesting; /* UNNEST_RECT */
-		    if (code < 0) {
-			band_code = code;
-			goto error_in_rect; /* ERROR_RECT(code); */
-		    }
+		    if (code < 0 && SET_BAND_CODE(code))
+			goto error_in_rect;
 		    continue;
 		}
 	    }
@@ -636,11 +666,14 @@
 			tile_with_id.id = gs_next_ids(dev->memory, 1);
 			tiles = &tile_with_id;
 		    }
-		    TRY_RECT {
+		    do {
 			code = clist_change_tile(cdev, pcls, tiles,
 						 (tcolors != 0 ? 1 :
 						  dev->color_info.depth));
-		    } HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck);
+		    } while (RECT_RECOVER(code));
+		    /* HANDLE_RECT_UNLESS(code, code == gs_error_limitcheck); */
+		    if (code < 0 && !(code == gs_error_limitcheck) && SET_BAND_CODE(code))
+			goto error_in_rect;
 		    if (code < 0) {
 			/*
 			 * The error is a limitcheck: we have a tile that
@@ -689,40 +722,46 @@
 					phase_x, pcls->tile_phase.y, lop);
 			    } 
 			    --cdev->driver_call_nesting; /* UNNEST_RECT */
-			    if (code < 0) {
-				band_code = code;
-				goto error_in_rect; /* ERROR_RECT(code); */
-			    }
+			    if (code < 0 && SET_BAND_CODE(code))
+				goto error_in_rect;
 			}
 			continue;
 		    }
 		    if (phase_x != pcls->tile_phase.x ||
 			phase_y != pcls->tile_phase.y
 			) {
-			TRY_RECT {
+			do {
 			    code = cmd_set_tile_phase(cdev, pcls, phase_x,
 						      phase_y);
-			} HANDLE_RECT_UNLESS(code, 0);
+			} while (RECT_RECOVER(code));
+			/* HANDLE_RECT_UNLESS(code, 0); */
+			if (code < 0 && SET_BAND_CODE(code))
+			    goto error_in_rect;
 		    }
 		}
 	    }
 	    /* Set the tile colors. */
-	    TRY_RECT {
+	    do {
 		code =
 		    (tcolors != 0 ?
 		     cmd_set_tile_colors(cdev, pcls, tcolors[0], tcolors[1]) :
 		     cmd_set_tile_colors(cdev, pcls, gx_no_color_index,
 					 gx_no_color_index));
-	    } HANDLE_RECT_UNLESS(code, 0);
+	    } while (RECT_RECOVER(code));
+	    /* HANDLE_RECT_UNLESS(code, 0); */
+	    if (code < 0 && SET_BAND_CODE(code))
+		goto error_in_rect;
 	}
-	TRY_RECT {
+	do {
 	    code = 0;
 	    if (lop != pcls->lop)
 		code = cmd_set_lop(cdev, pcls, lop);
 	    if (code >= 0)
 		code = cmd_enable_lop(cdev, pcls);
-	} HANDLE_RECT_UNLESS(code, 0);
-
+	} while (RECT_RECOVER(code));
+	/* HANDLE_RECT_UNLESS(code, 0); */
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
 	/* Set lop_enabled to -1 so that fill_rectangle / copy_* */
 	/* won't attempt to set it to 0. */
 	pcls->lop_enabled = -1;
@@ -742,10 +781,8 @@
 	} 
 	--cdev->driver_call_nesting; /* UNNEST_RECT */
 	pcls->lop_enabled = 1;
-	if (code < 0) {
-	    band_code = code;
-	    goto error_in_rect; /* ERROR_RECT(code); */
-	}
+	if (code < 0 && SET_BAND_CODE(code))
+	    goto error_in_rect;
     } END_RECTS;
     return 0;
 }



More information about the gs-cvs mailing list