From 0999b5cb77c9a1b44e7e194071c2acb7e33ffb1d Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Tue, 15 Aug 2017 15:52:46 +0200 Subject: [PATCH] Make texts search-able in PDF files (using invisible texts behind stroked texts) --- common/common_plotPDF_functions.cpp | 107 ++++++++++++++-------------- common/common_plotPS_functions.cpp | 12 +++- include/plot_common.h | 1 + 3 files changed, 65 insertions(+), 55 deletions(-) diff --git a/common/common_plotPDF_functions.cpp b/common/common_plotPDF_functions.cpp index 73fc28a71e..a8c1c50569 100644 --- a/common/common_plotPDF_functions.cpp +++ b/common/common_plotPDF_functions.cpp @@ -775,66 +775,67 @@ void PDF_PLOTTER::Text( const wxPoint& aPos, aMultilineAllowed = false; // the text has only one line. // Emit native PDF text (if requested) - // Currently: does not work: disable it - bool use_native = false; // = m_textMode != PLOTTEXTMODE_STROKE && !aMultilineAllowed; + // Currently: is not supported, because only our stroke font is alloxed: disable it + // However, shadowed texts (searchable texts) works reasonably well because + // pixel accurate precision is not requested, so we add searchable texts + // behind our stroked font texts + bool use_native_font = false; + // render_mode 0 shows the text, render_mode 3 is invisible + int render_mode = use_native_font ? 0 : 3; - if( use_native ) + const char *fontname = aItalic ? (aBold ? "/KicadFontBI" : "/KicadFontI") + : (aBold ? "/KicadFontB" : "/KicadFont"); + + // Compute the copious tranformation parameters of the Curent Transform Matrix + double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f; + double wideningFactor, heightFactor; + + computeTextParameters( aPos, aText, aOrient, aSize, m_plotMirror, aH_justify, + aV_justify, aWidth, aItalic, aBold, + &wideningFactor, &ctm_a, &ctm_b, &ctm_c, + &ctm_d, &ctm_e, &ctm_f, &heightFactor ); + + SetColor( aColor ); + SetCurrentLineWidth( aWidth, aData ); + + /* We use the full CTM instead of the text matrix because the same + coordinate system will be used for the overlining. Also the %f + for the trig part of the matrix to avoid %g going in exponential + format (which is not supported) + render_mode 0 shows the text, render_mode 3 is invisible */ + fprintf( workFile, "q %f %f %f %f %g %g cm BT %s %g Tf %d Tr %g Tz ", + ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f, + fontname, heightFactor, render_mode, + wideningFactor * 100 ); + + // The text must be escaped correctly + fputsPostscriptString( workFile, aText ); + fputs( " Tj ET\n", workFile ); + + // We are in text coordinates, plot the overbars, if we're not doing phantom text + if( use_native_font ) { - const char *fontname = aItalic ? (aBold ? "/KicadFontBI" : "/KicadFontI") - : (aBold ? "/KicadFontB" : "/KicadFont"); - - // Compute the copious tranformation parameters - double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f; - double wideningFactor, heightFactor; - computeTextParameters( aPos, aText, aOrient, aSize, aH_justify, - aV_justify, aWidth, aItalic, aBold, - &wideningFactor, &ctm_a, &ctm_b, &ctm_c, - &ctm_d, &ctm_e, &ctm_f, &heightFactor ); - - SetColor( aColor ); - SetCurrentLineWidth( aWidth, aData ); - - /* We use the full CTM instead of the text matrix because the same - coordinate system will be used for the overlining. Also the %f - for the trig part of the matrix to avoid %g going in exponential - format (which is not supported) - Rendermode 0 shows the text, rendermode 3 is invisible */ - fprintf( workFile, "q %f %f %f %f %g %g cm BT %s %g Tf %d Tr %g Tz ", - ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f, - fontname, heightFactor, - (m_textMode == PLOTTEXTMODE_NATIVE) ? 0 : 3, - wideningFactor * 100 ); - - // The text must be escaped correctly - fputsPostscriptString( workFile, aText ); - fputs( " Tj ET\n", workFile ); - - /* We are still in text coordinates, plot the overbars (if we're - * not doing phantom text) */ - if( m_textMode == PLOTTEXTMODE_NATIVE ) + std::vector pos_pairs; + postscriptOverlinePositions( aText, aSize.x, aItalic, aBold, &pos_pairs ); + int overbar_y = KiROUND( aSize.y * 1.1 ); + for( unsigned i = 0; i < pos_pairs.size(); i += 2) { - std::vector pos_pairs; - postscriptOverlinePositions( aText, aSize.x, aItalic, aBold, &pos_pairs ); - int overbar_y = KiROUND( aSize.y * 1.1 ); - for( unsigned i = 0; i < pos_pairs.size(); i += 2) - { - /* This is a nontrivial situation: we are *not* in the user - coordinate system, so the userToDeviceCoordinates function - can't be used! Strange as it may seem, the userToDeviceSize - is the right function to use here... */ - DPOINT dev_from = userToDeviceSize( wxSize( pos_pairs[i], overbar_y ) ); - DPOINT dev_to = userToDeviceSize( wxSize( pos_pairs[i + 1], overbar_y ) ); - fprintf( workFile, "%g %g m %g %g l ", - dev_from.x, dev_from.y, dev_to.x, dev_to.y ); - } + /* This is a nontrivial situation: we are *not* in the user + coordinate system, so the userToDeviceCoordinates function + can't be used! Strange as it may seem, the userToDeviceSize + is the right function to use here... */ + DPOINT dev_from = userToDeviceSize( wxSize( pos_pairs[i], overbar_y ) ); + DPOINT dev_to = userToDeviceSize( wxSize( pos_pairs[i + 1], overbar_y ) ); + fprintf( workFile, "%g %g m %g %g l ", + dev_from.x, dev_from.y, dev_to.x, dev_to.y ); } - - // Stroke and restore the CTM - fputs( "S Q\n", workFile ); } + // Stroke and restore the CTM + fputs( "S Q\n", workFile ); + // Plot the stroked text (if requested) - if( !use_native ) + if( !use_native_font ) { PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify, aWidth, aItalic, aBold, aMultilineAllowed ); diff --git a/common/common_plotPS_functions.cpp b/common/common_plotPS_functions.cpp index 93f339adfd..23aab5639a 100644 --- a/common/common_plotPS_functions.cpp +++ b/common/common_plotPS_functions.cpp @@ -427,6 +427,7 @@ void PSLIKE_PLOTTER::computeTextParameters( const wxPoint& aPos, const wxString& aText, int aOrient, const wxSize& aSize, + bool aMirror, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth, @@ -487,7 +488,14 @@ void PSLIKE_PLOTTER::computeTextParameters( const wxPoint& aPos, DPOINT sz_dev = userToDeviceSize( aSize ); // Now returns the final values... the widening factor - *wideningFactor = sz_dev.y / sz_dev.x; + *wideningFactor = sz_dev.x / sz_dev.y; + + // Mirrored texts must be plotted as mirrored! + if( m_plotMirror ) + { + *wideningFactor = -*wideningFactor; + aOrient = -aOrient; + } // The CTM transformation matrix double alpha = DECIDEG2RAD( aOrient ); @@ -953,7 +961,7 @@ void PS_PLOTTER::Text( const wxPoint& aPos, // Compute the copious tranformation parameters double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f; double wideningFactor, heightFactor; - computeTextParameters( aPos, aText, aOrient, aSize, aH_justify, + computeTextParameters( aPos, aText, aOrient, aSize, m_plotMirror, aH_justify, aV_justify, aWidth, aItalic, aBold, &wideningFactor, &ctm_a, &ctm_b, &ctm_c, &ctm_d, &ctm_e, &ctm_f, &heightFactor ); diff --git a/include/plot_common.h b/include/plot_common.h index 3cf0e4bc6f..ad7942674a 100644 --- a/include/plot_common.h +++ b/include/plot_common.h @@ -692,6 +692,7 @@ protected: const wxString& aText, int aOrient, const wxSize& aSize, + bool aMirror, enum EDA_TEXT_HJUSTIFY_T aH_justify, enum EDA_TEXT_VJUSTIFY_T aV_justify, int aWidth,