Index: board.c =================================================================== --- board.c (revision 36979) +++ board.c (revision 36980) @@ -97,7 +97,8 @@ /* NOTE: we used to set all the pcb flags on ptr here, but we don't need to do that anymore due to the new conf system */ ptr->hidlib.grid = rnd_conf.editor.grid; - ptr->hidlib.size_y = ptr->hidlib.size_x = RND_MM_TO_COORD(20); /* should be overriden by the default design */ + ptr->hidlib.dwg.Y1 = ptr->hidlib.dwg.X1 = 0; + ptr->hidlib.dwg.Y2 = ptr->hidlib.dwg.X2 = RND_MM_TO_COORD(20); /* should be overriden by the default design */ ptr->ID = pcb_create_ID_get(); ptr->ThermScale = 0.5; @@ -266,10 +267,12 @@ return rnd_true; } -static void pcb_board_resize_(pcb_board_t *pcb, rnd_coord_t Width, rnd_coord_t Height) +static void pcb_board_resize_(pcb_board_t *pcb, rnd_coord_t x1, rnd_coord_t y1, rnd_coord_t x2, rnd_coord_t y2) { - pcb->hidlib.size_x = Width; - pcb->hidlib.size_y = Height; + pcb->hidlib.dwg.X1 = x1; + pcb->hidlib.dwg.Y1 = y1; + pcb->hidlib.dwg.X2 = x2; + pcb->hidlib.dwg.Y2 = y2; if (pcb == PCB) pcb_board_replaced(0); @@ -279,7 +282,7 @@ typedef struct { pcb_board_t *pcb; - rnd_coord_t w, h; + rnd_coord_t x1, y1, x2, y2; double thermal_scale; } undo_board_size_t; @@ -287,11 +290,12 @@ { undo_board_size_t *s = udata; - if ((s->w != s->pcb->hidlib.size_x) || (s->h != s->pcb->hidlib.size_y)) { - rnd_coord_t oldw = s->pcb->hidlib.size_x, oldh = s->pcb->hidlib.size_y; - pcb_board_resize_(s->pcb, s->w, s->h); - s->w = oldw; - s->h = oldh; + if ((s->x1 != s->pcb->hidlib.dwg.X1) || (s->y1 != s->pcb->hidlib.dwg.Y1) || (s->x2 != s->pcb->hidlib.dwg.X2) || (s->y2 != s->pcb->hidlib.dwg.Y2)) { + rnd_coord_t old_x1 = s->pcb->hidlib.dwg.X1, old_y1 = s->pcb->hidlib.dwg.Y1; + rnd_coord_t old_x2 = s->pcb->hidlib.dwg.X2, old_y2 = s->pcb->hidlib.dwg.Y2; + pcb_board_resize_(s->pcb, s->x1, s->y1, s->x2, s->y2); + s->x1 = old_x1; s->y1 = old_y1; + s->x2 = old_x2; s->y2 = old_y2; } if (s->thermal_scale != s->pcb->ThermScale) { rnd_swap(double, s->thermal_scale, s->pcb->ThermScale); @@ -304,8 +308,8 @@ static void undo_board_size_print(void *udata, char *dst, size_t dst_len) { undo_board_size_t *s = udata; - if ((s->w != s->pcb->hidlib.size_x) || (s->w != s->pcb->hidlib.size_y)) - rnd_snprintf(dst, dst_len, "board_size: %mmx%mm ", s->w, s->h); + if ((s->x1 != s->pcb->hidlib.dwg.X1) || (s->y1 != s->pcb->hidlib.dwg.Y1) || (s->x2 != s->pcb->hidlib.dwg.X2) || (s->y2 != s->pcb->hidlib.dwg.Y2)) + rnd_snprintf(dst, dst_len, "board_size: %mm;%mm .. %mm;%mm ", s->x1, s->y1, s->x2, s->y2); if (s->thermal_scale != s->pcb->ThermScale) rnd_snprintf(dst, dst_len, "thermal scale: %f", s->thermal_scale); } @@ -318,19 +322,24 @@ undo_board_size_print }; -void pcb_board_resize(rnd_coord_t width, rnd_coord_t height, int undoable) +void pcb_board_resize(rnd_coord_t x1, rnd_coord_t y1, rnd_coord_t x2, rnd_coord_t y2, int undoable) { undo_board_size_t *s; if (!undoable) { - pcb_board_resize_(PCB, width, height); + pcb_board_resize_(PCB, x1, y1, x2, y2); return; } + if ((x1 != 0) || (y1 != 0)) + rnd_message(RND_MSG_ERROR, "pcb_board_resize(): drawing area should start at 0;0 for compatibility reasons\n"); + s = pcb_undo_alloc(PCB, &undo_board_size, sizeof(undo_board_size_t)); s->pcb = PCB; - s->w = width; - s->h = height; + s->x1 = x1; + s->y1 = y1; + s->x2 = x2; + s->y2 = y2; s->thermal_scale = PCB->ThermScale; undo_board_size_swap(s); } @@ -348,8 +357,10 @@ s = pcb_undo_alloc(PCB, &undo_board_size, sizeof(undo_board_size_t)); s->pcb = PCB; - s->w = PCB->hidlib.size_x; - s->h = PCB->hidlib.size_y; + s->x1 = PCB->hidlib.dwg.X1; + s->y1 = PCB->hidlib.dwg.Y1; + s->x2 = PCB->hidlib.dwg.X2; + s->y2 = PCB->hidlib.dwg.Y2; s->thermal_scale = thermal_scale; undo_board_size_swap(s); } @@ -392,13 +403,13 @@ if (pcb_data_bbox(&b, pcb->Data, rnd_false) == NULL) return -1; - if ((b.X2 - b.X1) > pcb->hidlib.size_x) { - pcb->hidlib.size_x = b.X2 - b.X1; + if ((b.X2 - b.X1) > pcb->hidlib.dwg.X2) { + pcb->hidlib.dwg.X2 = b.X2 - b.X1; chg++; } - if ((b.Y2 - b.Y1) > pcb->hidlib.size_y) { - pcb->hidlib.size_y = b.Y2 - b.Y1; + if ((b.Y2 - b.Y1) > pcb->hidlib.dwg.Y2) { + pcb->hidlib.dwg.Y2 = b.Y2 - b.Y1; chg++; } Index: board.h =================================================================== --- board.h (revision 36979) +++ board.h (revision 36980) @@ -132,7 +132,7 @@ void pcb_board_count_slots(pcb_board_t *pcb, int *plated, int *unplated, const rnd_box_t *within_area); #define PCB_SWAP_X(x) (RND_SWAP_SIGN_X(x)) -#define PCB_SWAP_Y(y) (PCB->hidlib.size_y +RND_SWAP_SIGN_Y(y)) +#define PCB_SWAP_Y(y) (PCB->hidlib.dwg.Y2 +RND_SWAP_SIGN_Y(y)) #define PCB_CSWAP_X(x, w, cond) ((cond) ? (RND_SWAP_SIGN_X(x)) : (x)) #define PCB_CSWAP_Y(y, h, cond) ((cond) ? (h+RND_SWAP_SIGN_Y(y)) : (y)) @@ -146,7 +146,7 @@ /* changes the maximum size of a layout, notifies the GUI * and adjusts the cursor confinement box */ -void pcb_board_resize(rnd_coord_t Width, rnd_coord_t Height, int undoable); +void pcb_board_resize(rnd_coord_t x1, rnd_coord_t y1, rnd_coord_t x2, rnd_coord_t y2, int undoable); /* change the thermal scale of the board, update the GUI */ void pcb_board_chg_thermal_scale(double thermal_scale, int undoable); Index: buffer.c =================================================================== --- buffer.c (revision 36979) +++ buffer.c (revision 36980) @@ -718,7 +718,7 @@ /* this results in saving flipped (bottom-side) footprints whenlooking at the board from the bottom */ PCB_SUBC_LOOP(Buffer->Data); { - pcb_subc_change_side(subc, /*2 * pcb_crosshair.Y - pcb->hidlib.size_y*/0); + pcb_subc_change_side(subc, /*2 * pcb_crosshair.Y - pcb->hidlib.dwg.Y2*/0); } PCB_END_LOOP; #endif Index: crosshair.c =================================================================== --- crosshair.c (revision 36979) +++ crosshair.c (revision 36980) @@ -915,8 +915,8 @@ oldx = pcb_crosshair.X; oldy = pcb_crosshair.Y; - pcb->hidlib.ch_x = pcb_crosshair.X = RND_CLAMP(X, -pcb->hidlib.size_x/2, pcb->hidlib.size_x*3/2); - pcb->hidlib.ch_y = pcb_crosshair.Y = RND_CLAMP(Y, -pcb->hidlib.size_y/2, pcb->hidlib.size_y*3/2); + pcb->hidlib.ch_x = pcb_crosshair.X = RND_CLAMP(X, pcb->hidlib.dwg.X1 - rnd_dwg_get_size_x(&pcb->hidlib)/2, pcb->hidlib.dwg.X2 + rnd_dwg_get_size_x(&pcb->hidlib)/2); + pcb->hidlib.ch_y = pcb_crosshair.Y = RND_CLAMP(Y, pcb->hidlib.dwg.Y1 - rnd_dwg_get_size_y(&pcb->hidlib)/2, pcb->hidlib.dwg.Y2 + rnd_dwg_get_size_y(&pcb->hidlib)/2); nearest_grid_x = rnd_grid_fit(pcb_crosshair.X, pcb->hidlib.grid, pcb->hidlib.grid_ox); nearest_grid_y = rnd_grid_fit(pcb_crosshair.Y, pcb->hidlib.grid, pcb->hidlib.grid_oy); Index: draw_composite.c =================================================================== --- draw_composite.c (revision 36979) +++ draw_composite.c (revision 36980) @@ -43,7 +43,7 @@ { rnd_render->set_color(pcb_draw_out.fgGC, ctx->color); if (ctx->info->drawn_area == NULL) - rnd_render->fill_rect(pcb_draw_out.fgGC, 0, 0, ctx->info->pcb->hidlib.size_x, ctx->info->pcb->hidlib.size_y); + rnd_render->fill_rect(pcb_draw_out.fgGC, ctx->info->pcb->hidlib.dwg.X1, ctx->info->pcb->hidlib.dwg.Y1, ctx->info->pcb->hidlib.dwg.X2, ctx->info->pcb->hidlib.dwg.Y2); else rnd_render->fill_rect(pcb_draw_out.fgGC, ctx->info->drawn_area->X1, ctx->info->drawn_area->Y1, ctx->info->drawn_area->X2, ctx->info->drawn_area->Y2); } Index: draw_ly_spec.c =================================================================== --- draw_ly_spec.c (revision 36979) +++ draw_ly_spec.c (revision 36980) @@ -293,7 +293,7 @@ rnd_render->set_color(pcb_draw_out.fgGC, &PCB->Data->Layer[goutl->lid[0]].meta.real.color); rnd_hid_set_line_cap(pcb_draw_out.fgGC, rnd_cap_round); rnd_hid_set_line_width(pcb_draw_out.fgGC, conf_core.design.min_wid); - rnd_render->draw_rect(pcb_draw_out.fgGC, 0, 0, PCB->hidlib.size_x, PCB->hidlib.size_y); + rnd_render->draw_rect(pcb_draw_out.fgGC, PCB->hidlib.dwg.X1, PCB->hidlib.dwg.Y1, PCB->hidlib.dwg.X2, PCB->hidlib.dwg.Y2); rnd_render->set_drawing_mode(rnd_render, RND_HID_COMP_FLUSH, pcb_draw_out.direct, info->drawn_area); rnd_render->end_layer(rnd_render); Index: file_act.c =================================================================== --- file_act.c (revision 36979) +++ file_act.c (revision 36980) @@ -181,7 +181,7 @@ pcb->hidlib.name = name; pcb_layervis_reset_stack(&pcb->hidlib); - pcb_center_display(pcb, pcb->hidlib.size_x / 2, pcb->hidlib.size_y / 2); + pcb_center_display(pcb, (pcb->hidlib.dwg.X1+pcb->hidlib.dwg.X2) / 2, (pcb->hidlib.dwg.Y1+pcb->hidlib.dwg.Y2) / 2); pcb_board_replaced(0); rnd_hid_redraw(pcb); rnd_hid_notify_crosshair_change(RND_ACT_HIDLIB, rnd_true); Index: obj_subc.c =================================================================== --- obj_subc.c (revision 36979) +++ obj_subc.c (revision 36980) @@ -1306,7 +1306,7 @@ last = pcb_undo_serial(); pcb_subc_get_origin(sc, &w, &h); - pcb_subc_change_side(sc, 2 * h - PCB->hidlib.size_y); + pcb_subc_change_side(sc, 2 * h - PCB->hidlib.dwg.Y2); pcb_undo_truncate_from(last); } @@ -1395,7 +1395,7 @@ PCB_SUBC_LOOP(PCB->Data); { if (PCB_FLAG_TEST(PCB_FLAG_SELECTED, subc)) { - change |= pcb_subc_change_side(subc, 2 * pcb_crosshair.Y - PCB->hidlib.size_y); + change |= pcb_subc_change_side(subc, 2 * pcb_crosshair.Y - PCB->hidlib.dwg.Y2); } } PCB_END_LOOP; @@ -2774,7 +2774,7 @@ } if (dst_on_bottom != src_on_bottom) - pcb_subc_change_side(placed, 2 * oy - PCB->hidlib.size_y); + pcb_subc_change_side(placed, 2 * oy - PCB->hidlib.dwg.Y2); if (pcb_subcrepl_apply_thermals_floaters(&repl, placed)) { pcb_opctx_t clip; Index: object_act.c =================================================================== --- object_act.c (revision 36979) +++ object_act.c (revision 36980) @@ -88,7 +88,7 @@ *dx += pcb->hidlib.grid; /* Figure out if this row has room. If not, start a new row */ - if (GAP + obj->BoundingBox.X2 + *dx > pcb->hidlib.size_x) { + if (GAP + obj->BoundingBox.X2 + *dx > pcb->hidlib.dwg.X2) { *miny = *maxy + GAP; *minx = GAP; } @@ -111,7 +111,7 @@ *minx = newx2 + GAP; if (*maxy < newy2) { *maxy = newy2; - if (*maxy > pcb->hidlib.size_y - GAP) { + if (*maxy > pcb->hidlib.dwg.Y2 - GAP) { *maxy = GAP; rnd_message(RND_MSG_WARNING, "The board is too small for hosting all subcircuits,\ndiesperse restarted from the top.\nExpect overlapping subcircuits\n"); } @@ -179,7 +179,7 @@ if ((pcb_search_screen(pcb_crosshair.X, pcb_crosshair.Y, PCB_OBJ_SUBC, &ptrtmp, &ptrtmp, &ptrtmp)) != PCB_OBJ_VOID) { pcb_subc_t *subc = (pcb_subc_t *)ptrtmp; pcb_undo_freeze_serial(); - pcb_subc_change_side(subc, 2 * pcb_crosshair.Y - RND_ACT_HIDLIB->size_y); + pcb_subc_change_side(subc, 2 * pcb_crosshair.Y - RND_ACT_HIDLIB->dwg.Y2); pcb_undo_unfreeze_serial(); pcb_undo_inc_serial(); pcb_draw(); @@ -378,9 +378,9 @@ plc->plc_method = PLC_DISPERSE; plc->rem_method = PLC_SELECT; plc->location = PLC_AT; - plc->lx = pcb->hidlib.size_x / 2; - plc->ly = pcb->hidlib.size_y / 2; - plc->dd = MIN(pcb->hidlib.size_x, pcb->hidlib.size_y) / 10; + plc->lx = pcb->hidlib.dwg.X2 / 2; + plc->ly = pcb->hidlib.dwg.Y2 / 2; + plc->dd = MIN(pcb->hidlib.dwg.X2, pcb->hidlib.dwg.Y2) / 10; plc->c = plc->cx = plc->cy = 0; plc->remlst = NULL; @@ -426,8 +426,8 @@ break; } case PLC_CENTER: - plc->lx = pcb->hidlib.size_x / 2; - plc->ly = pcb->hidlib.size_y / 2; + plc->lx = (pcb->hidlib.dwg.X1 + pcb->hidlib.dwg.X2) / 2; + plc->ly = (pcb->hidlib.dwg.Y1 + pcb->hidlib.dwg.Y2) / 2; break; } @@ -455,7 +455,7 @@ { rnd_coord_t bx = bbx.X2 - bbx.X1, by = bbx.Y2 - bbx.Y1; rnd_coord_t xo = PCB_PASTEBUFFER->X/2, yo = PCB_PASTEBUFFER->Y/2; - rnd_coord_t max = (plc->side % 2) ? plc->pcb->hidlib.size_y : plc->pcb->hidlib.size_x; + rnd_coord_t max = (plc->side % 2) ? plc->pcb->hidlib.dwg.Y2 : plc->pcb->hidlib.dwg.X2; rnd_coord_t mdim = (plc->side % 2) ? by : bx; /* rnd_coord_t adim = (plc->side % 2) ? bx : by;*/ pcb_subc_t *sc; @@ -469,9 +469,9 @@ switch(plc->side) { case 0: px = xo2 - bbx.X1 + plc->c; py = yo2 - bbx.Y2; break; /* top */ - case 1: py = yo2 - bbx.Y1 + plc->c; px = xo2 - bbx.X1 + plc->pcb->hidlib.size_x; break; /* right */ - case 2: px = plc->pcb->hidlib.size_x - (bbx.X2 - xo2 + plc->c); py = yo2 - bbx.Y1 + plc->pcb->hidlib.size_y; break; /* bottom, from right to left */ - case 3: py = plc->pcb->hidlib.size_y - (bbx.Y2 - yo2 + plc->c); px = xo2 - bbx.X2; break; /* left, from bottom to top */ + case 1: py = yo2 - bbx.Y1 + plc->c; px = xo2 - bbx.X1 + plc->pcb->hidlib.dwg.X2; break; /* right */ + case 2: px = plc->pcb->hidlib.dwg.X2 - (bbx.X2 - xo2 + plc->c); py = yo2 - bbx.Y1 + plc->pcb->hidlib.dwg.Y2; break; /* bottom, from right to left */ + case 3: py = plc->pcb->hidlib.dwg.Y2 - (bbx.Y2 - yo2 + plc->c); px = xo2 - bbx.X2; break; /* left, from bottom to top */ } plc->c += (double)mdim + RND_MM_TO_COORD(1); @@ -653,7 +653,7 @@ rnd_coord_t pcx = 0, pcy = 0; pcb_subc_get_origin(psc, &pcx, &pcy); if (!orig_on_top) - pcb_subc_change_side(psc, pcy * 2 - RND_ACT_HIDLIB->size_y); + pcb_subc_change_side(psc, pcy * 2 - RND_ACT_HIDLIB->dwg.Y2); if (orig_rot != 0) { double cosa, sina; cosa = cos(orig_rot / RND_RAD_TO_DEG); Index: plug_io.c =================================================================== --- plug_io.c (revision 36979) +++ plug_io.c (revision 36980) @@ -643,11 +643,11 @@ pcb_board_new_postproc(PCB, 0); if (how == 0) { /* update cursor location */ - PCB->hidlib.ch_x = pcb_crosshair.X = PCB->hidlib.size_x/2; - PCB->hidlib.ch_y = pcb_crosshair.Y = PCB->hidlib.size_y/2; + PCB->hidlib.ch_x = pcb_crosshair.X = (PCB->hidlib.dwg.X1 + PCB->hidlib.dwg.X2) / 2; + PCB->hidlib.ch_y = pcb_crosshair.Y = (PCB->hidlib.dwg.Y1 + PCB->hidlib.dwg.Y2) / 2; /* update cursor confinement and output area (scrollbars) */ - pcb_board_resize(PCB->hidlib.size_x, PCB->hidlib.size_y, 0); + pcb_board_resize(PCB->hidlib.dwg.X1, PCB->hidlib.dwg.Y1, PCB->hidlib.dwg.X2, PCB->hidlib.dwg.Y2, 0); } /* have to be called after pcb_board_resize() so vis update is after a board changed update */ @@ -834,7 +834,7 @@ res = -1; } else - pcb_board_resize(b.X2*1.5, b.Y2*1.5, 0); + pcb_board_resize(b.X1, b.Y1, b.X2*1.5, b.Y2*1.5, 0); } } return res;