Blob Blame History Raw
Index: eeschema/class_text-label.cpp
===================================================================
--- eeschema/class_text-label.cpp	(révision 2462)
+++ eeschema/class_text-label.cpp	(révision 2463)
@@ -1219,5 +1219,6 @@
         rect.SetEnd(end);
     }
 
+    rect.Normalize();
     return rect;
 }
Index: eeschema/class_sch_cmp_field.cpp
===================================================================
--- eeschema/class_sch_cmp_field.cpp	(révision 2462)
+++ eeschema/class_sch_cmp_field.cpp	(révision 2463)
@@ -155,10 +155,10 @@
                          LineWidth, m_Italic,
                          m_Bold, false );
     }
+
     /* Enable this to draw the bounding box around the text field to validate
      * the bounding box calculations.
     */
-
 #if 0
     // Draw boundary box:
     int x1 = BoundaryBox.GetX();
@@ -243,27 +243,24 @@
  */
 EDA_Rect SCH_FIELD::GetBoundaryBox() const
 {
-    EDA_Rect       BoundaryBox;
-    int            hjustify, vjustify;
-    int            orient;
-    int            dx, dy, x1, y1, x2, y2;
+    EDA_Rect BoundaryBox;
+    int      hjustify, vjustify;
+    int      orient;
+    wxSize   size;
+    wxPoint  pos1, pos2;
 
     SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent;
 
     orient = m_Orient;
-    wxPoint        pos = parentComponent->m_Pos;
-    x1 = m_Pos.x - pos.x;
-    y1 = m_Pos.y - pos.y;
+    wxPoint pos = parentComponent->m_Pos;
+    pos1 = m_Pos - pos;
 
-    dx = LenSize( m_Text );
-    dy = m_Size.y;
+    size.x = LenSize( m_Text );
+    size.y = m_Size.y;
     hjustify = m_HJustify;
     vjustify = m_VJustify;
 
-    x2 = pos.x + ( parentComponent->m_Transform[0][0] * x1 )
-         + ( parentComponent->m_Transform[0][1] * y1 );
-    y2 = pos.y + ( parentComponent->m_Transform[1][0] * x1 )
-         + ( parentComponent->m_Transform[1][1] * y1 );
+    pos2 = pos + TransformCoordinate( parentComponent->m_Transform, pos1 );
 
     /* Calculate the text orientation, according to the component
      * orientation/mirror */
@@ -295,42 +292,40 @@
     }
 
     if( orient == TEXT_ORIENT_VERT )
-        EXCHG( dx, dy );
+        EXCHG( size.x, size.y );
 
     switch( hjustify )
     {
     case GR_TEXT_HJUSTIFY_CENTER:
-        x1 = x2 - (dx / 2);
+        pos1.x = pos2.x - (size.x / 2);
         break;
 
     case GR_TEXT_HJUSTIFY_RIGHT:
-        x1 = x2 - dx;
+        pos1.x = pos2.x - size.x;
         break;
 
     default:
-        x1 = x2;
+        pos1.x = pos2.x;
         break;
     }
 
     switch( vjustify )
     {
     case GR_TEXT_VJUSTIFY_CENTER:
-        y1 = y2 - (dy / 2);
+        pos1.y = pos2.y - (size.y / 2);
         break;
 
     case GR_TEXT_VJUSTIFY_BOTTOM:
-        y1 = y2 - dy;
+        pos1.y = pos2.y - size.y;
         break;
 
     default:
-        y1 = y2;
+        pos1.y = pos2.y;
         break;
     }
 
-    BoundaryBox.SetX( x1 );
-    BoundaryBox.SetY( y1 );
-    BoundaryBox.SetWidth( dx );
-    BoundaryBox.SetHeight( dy );
+    BoundaryBox.SetOrigin( pos1 );
+    BoundaryBox.SetSize( size );
 
     // Take thickness in account:
     int linewidth = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width;
Index: eeschema/class_BodyItem_Text.cpp
===================================================================
--- eeschema/class_BodyItem_Text.cpp	(révision 2462)
+++ eeschema/class_BodyItem_Text.cpp	(révision 2463)
@@ -305,15 +305,54 @@
 
     GRSetDrawMode( aDC, aDrawMode );
 
+    /* Calculate the text orientation, according to the component
+     * orientation/mirror (needed when draw text in schematic)
+     */
+    int orient = m_Orient;
+    if( aTransformMatrix[0][1] )  // Rotate component 90 degrees.
+    {
+        if( orient == TEXT_ORIENT_HORIZ )
+            orient = TEXT_ORIENT_VERT;
+        else
+            orient = TEXT_ORIENT_HORIZ;
+    }
+
+    /* Calculate the text justification, according to the component
+     * orientation/mirror this is a bit complicated due to cumulative
+     * calculations:
+     * - numerous cases (mirrored or not, rotation)
+     * - the DrawGraphicText function recalculate also H and H justifications
+     *      according to the text orientation.
+     * - When a component is mirrored, the text is not mirrored and
+     *   justifications are complicated to calculate
+     * so the more easily way is to use no justifications ( Centered text )
+     * and use GetBoundaryBox to know the text coordinate considered as centered
+    */
+    EDA_Rect bBox = GetBoundingBox();
+    pos1 = bBox.Centre();   // this is the coordinates of the graphic text relative to the component position
+                            // in schematic Y axis orientation
+    /* convert y coordinate from schematic to library Y axis orientation
+     * because we want to call TransformCoordinate to calculate real coordinates
+     */
+    NEGATE( pos1.y );
+    pos1 = TransformCoordinate( aTransformMatrix, pos1 ) + aOffset;
     DrawGraphicText( aPanel, aDC, pos1, (EDA_Colors) color, m_Text,
-                     m_Orient, m_Size, m_HJustify, m_VJustify,
+                     orient, m_Size, GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER,
                      GetPenSize( ), m_Italic, m_Bold );
 
+    
+    /* Enable this to draw the bounding box around the text field to validate
+     * the bounding box calculations.
+    */
 #if 0
-    EDA_Rect bBox = GetBoundingBox();
-    bBox.Inflate( 1, 1 );
-    GRRect( &aPanel->m_ClipBox, aDC, bBox.GetOrigin().x, bBox.GetOrigin().y,
-            bBox.GetEnd().x, bBox.GetEnd().y, 0, LIGHTMAGENTA );
+    EDA_Rect grBox;
+    bBox.SetY( -bBox.GetY() );
+    bBox.SetHeight( -bBox.GetHeight());
+    grBox.SetOrigin( TransformCoordinate( aTransformMatrix, bBox.GetOrigin() ) );
+    grBox.SetEnd( TransformCoordinate( aTransformMatrix, bBox.GetEnd() ) );
+    grBox.Move( aOffset );
+    GRRect( &aPanel->m_ClipBox, aDC, grBox.GetOrigin().x, grBox.GetOrigin().y,
+            grBox.GetEnd().x, grBox.GetEnd().y, 0, LIGHTMAGENTA );
 #endif
 }
 
@@ -331,11 +370,18 @@
 }
 
 
+/**
+ * @return the boundary box for this, in schematic coordinates
+ */
 EDA_Rect LIB_TEXT::GetBoundingBox()
 {
+    /* remenber Y coordinates in lib are bottom to top, so we must
+     * negate the Y position befire calling GetTextBox() that works using top to bottom
+     * Y axis orientation
+     */
+    NEGATE(m_Pos.y );
     EDA_Rect rect = GetTextBox();
-    rect.m_Pos.y *= -1;
-    rect.m_Pos.y -= rect.GetHeight();
+    NEGATE(m_Pos.y );   // restore Y cooordinate for the graphic text
 
     wxPoint orig = rect.GetOrigin();
     wxPoint end = rect.GetEnd();
@@ -345,6 +391,6 @@
     RotatePoint( &end, center, m_Orient );
     rect.SetOrigin( orig );
     rect.SetEnd( end );
-
+    rect.Normalize();
     return rect;
 }