/* --------------------------------------------------------------------------- * rotates the contents of the pastebuffer */ void RotateBuffer (BufferType *Buffer, BYTE Number) { /* rotate vias */ VIA_LOOP (Buffer->Data); { r_delete_entry (Buffer->Data->via_tree, (BoxType *)via); ROTATE_VIA_LOWLEVEL (via, Buffer->X, Buffer->Y, Number); SetPinBoundingBox (via); r_insert_entry (Buffer->Data->via_tree, (BoxType *)via, 0); } END_LOOP; /* elements */ ELEMENT_LOOP (Buffer->Data); { RotateElementLowLevel (Buffer->Data, element, Buffer->X, Buffer->Y, Number); } END_LOOP; /* all layer related objects */ ALLLINE_LOOP (Buffer->Data); { r_delete_entry (layer->line_tree, (BoxType *)line); RotateLineLowLevel (line, Buffer->X, Buffer->Y, Number); r_insert_entry (layer->line_tree, (BoxType *)line, 0); } ENDALL_LOOP; ALLARC_LOOP (Buffer->Data); { r_delete_entry (layer->arc_tree, (BoxType *)arc); RotateArcLowLevel (arc, Buffer->X, Buffer->Y, Number); r_insert_entry (layer->arc_tree, (BoxType *)arc, 0); } ENDALL_LOOP; ALLTEXT_LOOP (Buffer->Data); { r_delete_entry (layer->text_tree, (BoxType *)text); RotateTextLowLevel (text, Buffer->X, Buffer->Y, Number); r_insert_entry (layer->text_tree, (BoxType *)text, 0); } ENDALL_LOOP; ALLPOLYGON_LOOP (Buffer->Data); { r_delete_entry (layer->polygon_tree, (BoxType *)polygon); RotatePolygonLowLevel (polygon, Buffer->X, Buffer->Y, Number); r_insert_entry (layer->polygon_tree, (BoxType *)polygon, 0); } ENDALL_LOOP; /* finally the origin and the bounding box */ ROTATE (Buffer->X, Buffer->Y, Buffer->X, Buffer->Y, Number); RotateBoxLowLevel (&Buffer->BoundingBox, Buffer->X, Buffer->Y, Number); SetCrosshairRangeToBuffer (); }
/* --------------------------------------------------------------------------- * drawing routine for text objects */ static void common_draw_pcb_text (hidGC gc, TextType *Text, Coord min_line_width) { Coord x = 0; unsigned char *string = (unsigned char *) Text->TextString; Cardinal n; FontType *font = &PCB->Font; while (string && *string) { /* draw lines if symbol is valid and data is present */ if (*string <= MAX_FONTPOSITION && font->Symbol[*string].Valid) { LineType *line = font->Symbol[*string].Line; LineType newline; for (n = font->Symbol[*string].LineN; n; n--, line++) { /* create one line, scale, move, rotate and swap it */ newline = *line; newline.Point1.X = SCALE_TEXT (newline.Point1.X + x, Text->Scale); newline.Point1.Y = SCALE_TEXT (newline.Point1.Y, Text->Scale); newline.Point2.X = SCALE_TEXT (newline.Point2.X + x, Text->Scale); newline.Point2.Y = SCALE_TEXT (newline.Point2.Y, Text->Scale); newline.Thickness = SCALE_TEXT (newline.Thickness, Text->Scale / 2); if (newline.Thickness < min_line_width) newline.Thickness = min_line_width; RotateLineLowLevel (&newline, 0, 0, Text->Direction); /* the labels of SMD objects on the bottom * side haven't been swapped yet, only their offset */ if (TEST_FLAG (ONSOLDERFLAG, Text)) { newline.Point1.X = SWAP_SIGN_X (newline.Point1.X); newline.Point1.Y = SWAP_SIGN_Y (newline.Point1.Y); newline.Point2.X = SWAP_SIGN_X (newline.Point2.X); newline.Point2.Y = SWAP_SIGN_Y (newline.Point2.Y); } /* add offset and draw line */ newline.Point1.X += Text->X; newline.Point1.Y += Text->Y; newline.Point2.X += Text->X; newline.Point2.Y += Text->Y; gui->graphics->draw_pcb_line (gc, &newline); } /* move on to next cursor position */ x += (font->Symbol[*string].Width + font->Symbol[*string].Delta); } else { /* the default symbol is a filled box */ BoxType defaultsymbol = PCB->Font.DefaultSymbol; Coord size = (defaultsymbol.X2 - defaultsymbol.X1) * 6 / 5; defaultsymbol.X1 = SCALE_TEXT (defaultsymbol.X1 + x, Text->Scale); defaultsymbol.Y1 = SCALE_TEXT (defaultsymbol.Y1, Text->Scale); defaultsymbol.X2 = SCALE_TEXT (defaultsymbol.X2 + x, Text->Scale); defaultsymbol.Y2 = SCALE_TEXT (defaultsymbol.Y2, Text->Scale); RotateBoxLowLevel (&defaultsymbol, 0, 0, Text->Direction); /* add offset and draw box */ defaultsymbol.X1 += Text->X; defaultsymbol.Y1 += Text->Y; defaultsymbol.X2 += Text->X; defaultsymbol.Y2 += Text->Y; gui->graphics->fill_rect (gc, defaultsymbol.X1, defaultsymbol.Y1, defaultsymbol.X2, defaultsymbol.Y2); /* move on to next cursor position */ x += size; } string++; } }