📄 out_blk.c
字号:
/* normalize to x origin */ sp_globals.clip_xmin -= sp_globals.xmin; } if (sp_globals.specs.flags & CLIP_BOTTOM) { sp_globals.clip_xmax = (fix31)((fix31)EM_TOP * sp_globals.tcb0.yppo + ((1<<sp_globals.multshift)/2)); sp_globals.clip_xmax = sp_globals.clip_xmax >> sp_globals.multshift; bmap_max = (sp_globals.bmap_xmax + sp_globals.pixrnd) >> sp_globals.pixshift; if (bmap_max < sp_globals.clip_xmax) sp_globals.xmax = bmap_max; else sp_globals.xmax = sp_globals.clip_xmax; sp_globals.clip_ymax = 0; if ((sp_globals.specs.flags & CLIP_TOP) && (sp_globals.ymax > sp_globals.clip_ymax)) sp_globals.ymax = sp_globals.clip_ymax; sp_globals.clip_ymin = ((sp_globals.set_width.y+32768L) >> 16); if ((sp_globals.specs.flags & CLIP_BOTTOM) && (sp_globals.ymin < sp_globals.clip_ymin)) sp_globals.ymin = sp_globals.clip_ymin; /* normalize to x origin */ sp_globals.clip_xmax -= sp_globals.xmin; } break; case 3: /* 270 degree rotation */ if (sp_globals.specs.flags & CLIP_TOP) { sp_globals.clip_xmin = (fix31)((fix31)EM_TOP * sp_globals.tcb0.yppo + ((1<<sp_globals.multshift)/2)); sp_globals.clip_xmin = sp_globals.clip_xmin >> sp_globals.multshift; sp_globals.clip_xmin = -1 * sp_globals.clip_xmin; bmap_min = (sp_globals.bmap_xmin + sp_globals.pixrnd + 1) >> sp_globals.pixshift; /* let the minimum be the larger of these two values */ if (bmap_min > sp_globals.clip_xmin) sp_globals.clip_xmin = bmap_min; /* normalize the x value to new xorgin */ sp_globals.clip_xmin -= sp_globals.xmin; } if (sp_globals.specs.flags & CLIP_BOTTOM) { sp_globals.clip_xmax = (fix31)((fix31)(-1 * EM_BOT) * sp_globals.tcb0.yppo + ((1<<sp_globals.multshift)/2)); sp_globals.clip_xmax = sp_globals.clip_xmax >> sp_globals.multshift; bmap_max = (sp_globals.bmap_xmax + sp_globals.pixrnd) >> sp_globals.pixshift; /* let the max be the lesser of these two values */ if (bmap_max < sp_globals.clip_xmax) { sp_globals.xmax = bmap_max; sp_globals.clip_xmax = bmap_max; } else sp_globals.xmax = sp_globals.clip_xmax; /* normalize the x value to new x origin */ sp_globals.clip_xmax -= sp_globals.xmin; } /* compute y clip values */ sp_globals.clip_ymax = ((sp_globals.set_width.y+32768L) >> 16); if ((sp_globals.specs.flags & CLIP_TOP) && (sp_globals.ymax > sp_globals.clip_ymax)) sp_globals.ymax = sp_globals.clip_ymax; sp_globals.clip_ymin = 0; if ((sp_globals.specs.flags & CLIP_BOTTOM) && (sp_globals.ymin < sp_globals.clip_ymin)) sp_globals.ymin = sp_globals.clip_ymin; break; default: /* this is for zero degree rotation and arbitrary rotation */ if (sp_globals.specs.flags & CLIP_TOP) { sp_globals.clip_ymax = (fix31)((fix31)EM_TOP * sp_globals.tcb0.yppo + ((1<<sp_globals.multshift)/2)); sp_globals.clip_ymax = sp_globals.clip_ymax >> sp_globals.multshift; bmap_max = (sp_globals.bmap_ymax + sp_globals.pixrnd) >> sp_globals.pixshift; if (bmap_max > sp_globals.clip_ymax) sp_globals.ymax = bmap_max; else sp_globals.ymax = sp_globals.clip_ymax; } if (sp_globals.specs.flags & CLIP_BOTTOM) { sp_globals.clip_ymin = (fix31)((fix31)(-1 * EM_BOT) * sp_globals.tcb0.yppo + ((1<<sp_globals.multshift)/2)); sp_globals.clip_ymin = sp_globals.clip_ymin >> sp_globals.multshift; sp_globals.clip_ymin = - sp_globals.clip_ymin; bmap_min = (sp_globals.bmap_ymin + sp_globals.pixrnd + 1) >> sp_globals.pixshift; if (bmap_min < sp_globals.clip_ymin) sp_globals.ymin = sp_globals.clip_ymin; else sp_globals.ymin = bmap_min; } sp_globals.clip_xmin = -sp_globals.xmin; sp_globals.clip_xmax = ((sp_globals.set_width.x+32768L) >> 16) - sp_globals.xmin; break; }if ( !(sp_globals.specs.flags & CLIP_TOP))#endif sp_globals.ymax = (sp_globals.bmap_ymax + sp_globals.pixrnd) >> sp_globals.pixshift;#if INCL_CLIPPINGif ( !(sp_globals.specs.flags & CLIP_BOTTOM))#endif sp_globals.ymin = (sp_globals.bmap_ymin + sp_globals.pixrnd + 1) >> sp_globals.pixshift; } else { sp_globals.ymin = sp_globals.ymax = 0; } /* add in the rounded out part (from xform.) of the left edge */ if (sp_globals.tcb.xmode == 0) /* for X pix is function of X orus only add the round */ xorg = (((fix31)sp_globals.xmin << 16) + (sp_globals.rnd_xmin << sp_globals.poshift)); else if (sp_globals.tcb.xmode == 1) /* for X pix is function of -X orus only, subtr. round */ xorg = (((fix31)sp_globals.xmin << 16) - (sp_globals.rnd_xmin << sp_globals.poshift)) ; else xorg = (fix31)sp_globals.xmin << 16; /* for other cases don't use round on x */ if (sp_globals.tcb.ymode == 2) /* for Y pix is function of X orus only, add round error */ yorg = (((fix31)sp_globals.ymin << 16) + (sp_globals.rnd_xmin << sp_globals.poshift)); else if (sp_globals.tcb.ymode == 3) /* for Y pix is function of -X orus only, sub round */ yorg = (((fix31)sp_globals.ymin << 16) - (sp_globals.rnd_xmin << sp_globals.poshift)); else /* all other cases have no round error on yorg */ yorg = (fix31)sp_globals.ymin << 16; open_bitmap(sp_globals.set_width.x, sp_globals.set_width.y, xorg, yorg, sp_globals.xmax - sp_globals.xmin, sp_globals.ymax - sp_globals.ymin); if (sp_globals.intercept_oflo) { sp_globals.y_band.band_min = sp_globals.ymin; sp_globals.y_band.band_max = sp_globals.ymax; init_intercepts_out(); sp_globals.first_pass = FALSE; sp_globals.extents_running = FALSE; return FALSE; } else { sp_proc_intercepts_black(); close_bitmap(); return TRUE; } }else { if (sp_globals.intercept_oflo) { reduce_band_size_out(); init_intercepts_out(); return FALSE; } else { sp_proc_intercepts_black(); if (next_band_out()) { init_intercepts_out(); return FALSE; } close_bitmap(); return TRUE; } }}#endif#if INCL_BLACKFUNCTION LOCAL void sp_add_intercept_black(y, x)GDECLfix15 y; /* Y coordinate in relative pixel units */ /* (0 is lowest sample in band) */fix15 x; /* X coordinate of intercept in subpixel units *//* Called by line() to add an intercept to the intercept list structure */{register fix15 from; /* Insertion pointers for the linked list sort */register fix15 to;#if DEBUGprintf(" Add intercept(%2d, %d)\n", y + sp_globals.y_band.band_min,x);/* Bounds checking IS done in debug mode */if (y < 0) /* Y value below bottom of current band? */ { printf(" Intecerpt less than 0!!!\007\n"); return; }if (y > (sp_globals.no_y_lists - 1)) /* Y value above top of current band? */ { printf(" Intercept too big for band!!!!!\007\n"); return; }#endif/* Store new values */sp_intercepts.car[sp_globals.next_offset] = x;/* Find slot to insert new element (between from and to) */from = y; /* Start at list head */while( (to = sp_intercepts.cdr[from]) >= sp_globals.first_offset) /* Until to == end of list */ { if (x <= sp_intercepts.car[to]) /* If next item is larger than or same as this one... */ goto insert_element; /* ... drop out and insert here */ from = to; /* move forward in list */ }insert_element: /* insert element "sp_globals.next_offset" between elements "from" */ /* and "to" */sp_intercepts.cdr[from] = sp_globals.next_offset;sp_intercepts.cdr[sp_globals.next_offset] = to;if (++sp_globals.next_offset >= MAX_INTERCEPTS) /* Intercept buffer full? */ { sp_globals.intercept_oflo = TRUE;/* There may be a few more calls to "add_intercept" from the current line *//* To avoid problems, we set next_offset to a safe value. We don't care *//* if the intercept table gets trashed at this point */ sp_globals.next_offset = sp_globals.first_offset; }}#endif#if INCL_BLACKFUNCTION LOCAL void sp_proc_intercepts_black()GDECL/* Called by sp_make_char to output accumulated intercept lists * Clips output to sp_globals.xmin, sp_globals.xmax, sp_globals.ymin, sp_globals.ymax boundaries */{register fix15 i;register fix15 from, to; /* Start and end of run in pixel units relative to left extent of character */register fix15 y;register fix15 scan_line; fix15 first_y, last_y; fix15 xmin, xmax; boolean clipleft, clipright;#if DEBUGprintf("\nIntercept lists:\n");#endif#if INCL_CLIPPINGif ((sp_globals.specs.flags & CLIP_LEFT) != 0) clipleft = TRUE;else clipleft = FALSE;if ((sp_globals.specs.flags & CLIP_RIGHT) != 0) clipright = TRUE;else clipright = FALSE;if (clipleft || clipright) { xmax = sp_globals.clip_xmax; xmin = sp_globals.clip_xmin; }if (!clipright) xmax = ((sp_globals.set_width.x+32768L) >> 16);#endifif ((first_y = sp_globals.y_band.band_max) >= sp_globals.ymax) first_y = sp_globals.ymax - 1; /* Clip to sp_globals.ymax boundary */if ((last_y = sp_globals.y_band.band_min) < sp_globals.ymin) last_y = sp_globals.ymin; /* Clip to sp_globals.ymin boundary */last_y -= sp_globals.y_band.band_min;#if DEBUG/* Print out all of the intercept info */scan_line = sp_globals.ymax - first_y - 1;for (y = first_y - sp_globals.y_band.band_min; y >= last_y; y--, scan_line++) { i = y; /* Index head of intercept list */ while ((i = sp_intercepts.cdr[i]) != 0) /* Link to next intercept if present */ { if ((from = sp_intercepts.car[i] - sp_globals.xmin) < 0) from = 0; /* Clip to sp_globals.xmin boundary */ i = sp_intercepts.cdr[i]; /* Link to next intercept */ if (i == 0) /* End of list? */ { printf("****** proc_intercepts: odd number of intercepts\n"); break; } if ((to = sp_intercepts.car[i]) > sp_globals.xmax) to = sp_globals.xmax - sp_globals.xmin; /* Clip to sp_globals.xmax boundary */ else to -= sp_globals.xmin; printf(" Y = %2d (scanline %2d): %d %d:\n", y + sp_globals.y_band.band_min, scan_line, from, to); } }#endif/* Draw the image */scan_line = sp_globals.ymax - first_y - 1;for (y = first_y - sp_globals.y_band.band_min; y >= last_y; y--, scan_line++) { i = y; /* Index head of intercept list */ while ((i = sp_intercepts.cdr[i]) != 0) /* Link to next intercept if present */ { if ((from = sp_intercepts.car[i] - sp_globals.xmin) < 0) from = 0; /* Clip to sp_globals.xmin boundary */ i = sp_intercepts.cdr[i]; /* Link to next intercept */ if ((to = sp_intercepts.car[i]) > sp_globals.xmax) to = sp_globals.xmax - sp_globals.xmin; /* Clip to sp_globals.xmax boundary */ else to -= sp_globals.xmin; if (from >= to) { if (from >= sp_globals.xmax - sp_globals.xmin) { --from ; } to = from+1; }#if INCL_CLIPPING if (clipleft) { if (to <= xmin) continue; if (from < xmin) from = xmin; } if (clipright) { if (from >= xmax) continue; if (to > xmax) to = xmax; }#endif set_bitmap_bits(scan_line, from, to); } }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -