static int FontEdit (int argc, char **argv, Coord Ux, Coord Uy) { FontType *font; SymbolType *symbol; LayerType *lfont, *lorig, *lwidth, *lgrid; int s, l; if (hid_actionl ("New", "Font", 0)) { return 1; } Settings.grid_unit = get_unit_struct("mil"); Settings.Bloat = PCB->Bloat = 1; Settings.Shrink = PCB->Shrink = 1; Settings.minWid = PCB->minWid = 1; Settings.minSlk = PCB->minSlk = 1; MoveLayerToGroup (max_copper_layer + TOP_SILK_LAYER, 0); MoveLayerToGroup (max_copper_layer + BOTTOM_SILK_LAYER, 1); while (PCB->Data->LayerN > 4) { MoveLayer (4, -1); } for (l = 0; l < 4; l++) { MoveLayerToGroup (l, l); } PCB->MaxWidth = CELL_SIZE * 18; PCB->MaxHeight = CELL_SIZE * ((MAX_FONTPOSITION + 15) / 16 + 2); PCB->Grid = MIL_TO_COORD (5); PCB->Data->Layer[0].Name = strdup ("Font"); PCB->Data->Layer[1].Name = strdup ("OrigFont"); PCB->Data->Layer[2].Name = strdup ("Width"); PCB->Data->Layer[3].Name = strdup ("Grid"); hid_action ("PCBChanged"); hid_action ("LayersChanged"); lfont = PCB->Data->Layer + 0; lorig = PCB->Data->Layer + 1; lwidth = PCB->Data->Layer + 2; lgrid = PCB->Data->Layer + 3; font = &PCB->Font; for (s = 0; s <= MAX_FONTPOSITION; s++) { Coord ox = (s % 16 + 1) * CELL_SIZE; Coord oy = (s / 16 + 1) * CELL_SIZE; Coord w, miny, maxy, maxx = 0; symbol = &font->Symbol[s]; miny = MIL_TO_COORD (5); maxy = font->MaxHeight; for (l = 0; l < symbol->LineN; l++) { CreateDrawnLineOnLayer (lfont, symbol->Line[l].Point1.X + ox, symbol->Line[l].Point1.Y + oy, symbol->Line[l].Point2.X + ox, symbol->Line[l].Point2.Y + oy, symbol->Line[l].Thickness, symbol->Line[l].Thickness, NoFlags ()); CreateDrawnLineOnLayer (lorig, symbol->Line[l].Point1.X + ox, symbol->Line[l].Point1.Y + oy, symbol->Line[l].Point2.X + ox, symbol->Line[l].Point2.Y + oy, symbol->Line[l].Thickness, symbol->Line[l].Thickness, NoFlags ()); if (maxx < symbol->Line[l].Point1.X) { maxx = symbol->Line[l].Point1.X; } if (maxx < symbol->Line[l].Point2.X) { maxx = symbol->Line[l].Point2.X; } } w = maxx + symbol->Delta + ox; CreateDrawnLineOnLayer (lwidth, w, miny + oy, w, maxy + oy, MIL_TO_COORD (1), MIL_TO_COORD (1), NoFlags ()); } for (l = 0; l < 16; l++) { int x = (l + 1) * CELL_SIZE; CreateDrawnLineOnLayer (lgrid, x, 0, x, PCB->MaxHeight, MIL_TO_COORD (1), MIL_TO_COORD (1), NoFlags ()); } for (l = 0; l <= MAX_FONTPOSITION / 16 + 1; l++) { int y = (l + 1) * CELL_SIZE; CreateDrawnLineOnLayer (lgrid, 0, y, PCB->MaxWidth, y, MIL_TO_COORD (1), MIL_TO_COORD (1), NoFlags ()); } return 0; }
static int FontEdit (int argc, char **argv, int Ux, int Uy) { FontType *font; SymbolType *symbol; LayerTypePtr lfont, lorig, lwidth, lgrid; int s, l; if (hid_actionl ("New", "Font", 0)) return 1; while (PCB->Data->LayerN > 4) MoveLayer (4, -1); for (l = 0; l < 4; l++) { MoveLayerToGroup (l, l); } PCB->MaxWidth = CELL_SIZE * 18; PCB->MaxHeight = CELL_SIZE * ((MAX_FONTPOSITION + 15) / 16 + 2); PCB->Grid = 500.0; PCB->Data->Layer[0].Name = MyStrdup ("Font", "FontEdit"); PCB->Data->Layer[1].Name = MyStrdup ("OrigFont", "FontEdit"); PCB->Data->Layer[2].Name = MyStrdup ("Width", "FontEdit"); PCB->Data->Layer[3].Name = MyStrdup ("Grid", "FontEdit"); hid_action ("PCBChanged"); hid_action ("LayersChanged"); lfont = PCB->Data->Layer + 0; lorig = PCB->Data->Layer + 1; lwidth = PCB->Data->Layer + 2; lgrid = PCB->Data->Layer + 3; font = &PCB->Font; for (s = 0; s <= MAX_FONTPOSITION; s++) { int ox = (s % 16 + 1) * CELL_SIZE; int oy = (s / 16 + 1) * CELL_SIZE; int w, miny, maxy, maxx = 0; symbol = &font->Symbol[s]; miny = 500; maxy = font->MaxHeight; for (l = 0; l < symbol->LineN; l++) { CreateDrawnLineOnLayer (lfont, symbol->Line[l].Point1.X + ox, symbol->Line[l].Point1.Y + oy, symbol->Line[l].Point2.X + ox, symbol->Line[l].Point2.Y + oy, symbol->Line[l].Thickness, symbol->Line[l].Thickness, NoFlags ()); CreateDrawnLineOnLayer (lorig, symbol->Line[l].Point1.X + ox, symbol->Line[l].Point1.Y + oy, symbol->Line[l].Point2.X + ox, symbol->Line[l].Point2.Y + oy, symbol->Line[l].Thickness, symbol->Line[l].Thickness, NoFlags ()); if (maxx < symbol->Line[l].Point1.X) maxx = symbol->Line[l].Point1.X; if (maxx < symbol->Line[l].Point2.X) maxx = symbol->Line[l].Point2.X; } w = maxx + symbol->Delta + ox; CreateDrawnLineOnLayer (lwidth, w, miny + oy, w, maxy + oy, 100, 100, NoFlags ()); } for (l = 0; l < 16; l++) { int x = (l + 1) * CELL_SIZE; CreateDrawnLineOnLayer (lgrid, x, 0, x, PCB->MaxHeight, 100, 100, NoFlags ()); } for (l = 0; l <= MAX_FONTPOSITION / 16 + 1; l++) { int y = (l + 1) * CELL_SIZE; CreateDrawnLineOnLayer (lgrid, 0, y, PCB->MaxWidth, y, 100, 100, NoFlags ()); } return 0; }