00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <qpainter.h>
00021 #include <qpen.h>
00022
00023 #include <kdebug.h>
00024 #include <klocale.h>
00025
00026 #include "kformuladefs.h"
00027 #include "symbolfontstyle.h"
00028
00029
00030 KFORMULA_NAMESPACE_BEGIN
00031
00032 #include "symbolfontmapping.cc"
00033
00034
00035 SymbolFontHelper::SymbolFontHelper()
00036 : greek("abgdezhqiklmnxpvrstufjcywGDQLXPSUFYVW")
00037 {
00038 for ( uint i = 0; symbolMap[ i ].unicode != 0; i++ ) {
00039 compatibility[ symbolMap[ i ].pos ] = symbolMap[ i ].unicode;
00040 }
00041 }
00042
00043
00044 bool SymbolFontStyle::init( ContextStyle* context )
00045 {
00046
00047
00048 symbolTable()->init( context );
00049
00050 SymbolTable::NameTable names;
00051 fillNameTable( names );
00052 symbolTable()->initFont( symbolMap, "symbol", names );
00053
00054 return true;
00055 }
00056
00057
00058 Artwork* SymbolFontStyle::createArtwork( SymbolType type ) const
00059 {
00060 return new SymbolArtwork( type );
00061 }
00062
00063
00064 inline bool doSimpleRoundBracket( luPt height, luPt baseHeight )
00065 {
00066 return height < 1.5*baseHeight;
00067 }
00068
00069 inline bool doSimpleSquareBracket( luPt height, luPt baseHeight )
00070 {
00071 return height < 1.5*baseHeight;
00072 }
00073
00074 inline bool doSimpleCurlyBracket( luPt height, luPt baseHeight )
00075 {
00076 return height < 2*baseHeight;
00077 }
00078
00079
00080 void SymbolArtwork::calcSizes( const ContextStyle& style,
00081 ContextStyle::TextStyle tstyle,
00082 luPt parentSize )
00083 {
00084 setBaseline( -1 );
00085 luPt mySize = style.getAdjustedSize( tstyle );
00086 switch (getType()) {
00087 case LeftSquareBracket:
00088 if ( doSimpleSquareBracket( parentSize, mySize ) ) {
00089 calcCharSize( style, mySize, leftSquareBracketChar );
00090 return;
00091 }
00092 calcRoundBracket( style, leftSquareBracket, parentSize, mySize );
00093 break;
00094 case RightSquareBracket:
00095 if ( doSimpleSquareBracket( parentSize, mySize ) ) {
00096 calcCharSize(style, mySize, rightSquareBracketChar);
00097 return;
00098 }
00099 calcRoundBracket( style, rightSquareBracket, parentSize, mySize );
00100 break;
00101 case LeftLineBracket:
00102 if ( doSimpleSquareBracket( parentSize, mySize ) ) {
00103 calcCharSize(style, mySize, verticalLineChar);
00104 return;
00105 }
00106 calcRoundBracket( style, leftLineBracket, parentSize, mySize );
00107 break;
00108 case RightLineBracket:
00109 if ( doSimpleSquareBracket( parentSize, mySize ) ) {
00110 calcCharSize(style, mySize, verticalLineChar);
00111 return;
00112 }
00113 calcRoundBracket( style, rightLineBracket, parentSize, mySize );
00114 break;
00115 case SlashBracket:
00116
00117 break;
00118 case BackSlashBracket:
00119
00120 break;
00121 case LeftCornerBracket:
00122 calcCharSize(style, mySize, leftAngleBracketChar);
00123 break;
00124 case RightCornerBracket:
00125 calcCharSize(style, mySize, rightAngleBracketChar);
00126 break;
00127 case LeftRoundBracket:
00128 if ( doSimpleRoundBracket( parentSize, mySize ) ) {
00129 calcCharSize(style, mySize, leftParenthesisChar);
00130 return;
00131 }
00132 calcRoundBracket( style, leftRoundBracket, parentSize, mySize );
00133 break;
00134 case RightRoundBracket:
00135 if ( doSimpleRoundBracket( parentSize, mySize ) ) {
00136 calcCharSize(style, mySize, rightParenthesisChar);
00137 return;
00138 }
00139 calcRoundBracket( style, rightRoundBracket, parentSize, mySize );
00140 break;
00141 case EmptyBracket:
00142 setHeight(parentSize);
00143
00144 setWidth(0);
00145 break;
00146 case LeftCurlyBracket:
00147 if ( doSimpleCurlyBracket( parentSize, mySize ) ) {
00148 calcCharSize(style, mySize, leftCurlyBracketChar);
00149 return;
00150 }
00151 calcCurlyBracket( style, leftCurlyBracket, parentSize, mySize );
00152 break;
00153 case RightCurlyBracket:
00154 if ( doSimpleCurlyBracket( parentSize, mySize ) ) {
00155 calcCharSize(style, mySize, rightCurlyBracketChar);
00156 return;
00157 }
00158 calcCurlyBracket( style, rightCurlyBracket, parentSize, mySize );
00159 break;
00160 case Integral:
00161 calcCharSize( style, qRound( 1.5*mySize ), integralChar );
00162 break;
00163 case Sum:
00164 calcCharSize( style, qRound( 1.5*mySize ), summationChar );
00165 break;
00166 case Product:
00167 calcCharSize( style, qRound( 1.5*mySize ), productChar );
00168 break;
00169 }
00170 }
00171
00172
00173 void SymbolArtwork::draw(QPainter& painter, const LuPixelRect& r,
00174 const ContextStyle& style, ContextStyle::TextStyle tstyle,
00175 luPt parentSize, const LuPixelPoint& origin)
00176 {
00177 luPt mySize = style.getAdjustedSize( tstyle );
00178 luPixel myX = origin.x() + getX();
00179 luPixel myY = origin.y() + getY();
00180 if ( !LuPixelRect( myX, myY, getWidth(), getHeight() ).intersects( r ) )
00181 return;
00182
00183 painter.setPen(style.getDefaultColor());
00184
00185 switch (getType()) {
00186 case LeftSquareBracket:
00187 if ( !doSimpleSquareBracket( parentSize, mySize ) ) {
00188 drawBigRoundBracket( painter, style, leftSquareBracket, myX, myY, mySize );
00189 }
00190 else {
00191 drawCharacter(painter, style, myX, myY, mySize, leftSquareBracketChar);
00192 }
00193 break;
00194 case RightSquareBracket:
00195 if ( !doSimpleSquareBracket( parentSize, mySize ) ) {
00196 drawBigRoundBracket( painter, style, rightSquareBracket, myX, myY, mySize );
00197 }
00198 else {
00199 drawCharacter(painter, style, myX, myY, mySize, rightSquareBracketChar);
00200 }
00201 break;
00202 case LeftCurlyBracket:
00203 if ( !doSimpleCurlyBracket( parentSize, mySize ) ) {
00204 drawBigCurlyBracket( painter, style, leftCurlyBracket, myX, myY, mySize );
00205 }
00206 else {
00207 drawCharacter(painter, style, myX, myY, mySize, leftCurlyBracketChar);
00208 }
00209 break;
00210 case RightCurlyBracket:
00211 if ( !doSimpleCurlyBracket( parentSize, mySize ) ) {
00212 drawBigCurlyBracket( painter, style, rightCurlyBracket, myX, myY, mySize );
00213 }
00214 else {
00215 drawCharacter(painter, style, myX, myY, mySize, rightCurlyBracketChar);
00216 }
00217 break;
00218 case LeftLineBracket:
00219 if ( !doSimpleSquareBracket( parentSize, mySize ) ) {
00220 drawBigRoundBracket( painter, style, leftLineBracket, myX, myY, mySize );
00221 }
00222 else {
00223 drawCharacter(painter, style, myX, myY, mySize, verticalLineChar);
00224 }
00225 break;
00226 case RightLineBracket:
00227 if ( !doSimpleSquareBracket( parentSize, mySize ) ) {
00228 drawBigRoundBracket( painter, style, rightLineBracket, myX, myY, mySize );
00229 }
00230 else {
00231 drawCharacter(painter, style, myX, myY, mySize, verticalLineChar);
00232 }
00233 break;
00234 case SlashBracket:
00235
00236 break;
00237 case BackSlashBracket:
00238
00239 break;
00240 case LeftCornerBracket:
00241 drawCharacter(painter, style, myX, myY, mySize, leftAngleBracketChar);
00242 break;
00243 case RightCornerBracket:
00244 drawCharacter(painter, style, myX, myY, mySize, rightAngleBracketChar);
00245 break;
00246 case LeftRoundBracket:
00247 if ( !doSimpleRoundBracket( parentSize, mySize ) ) {
00248 drawBigRoundBracket( painter, style, leftRoundBracket, myX, myY, mySize );
00249 }
00250 else {
00251 drawCharacter(painter, style, myX, myY, mySize, leftParenthesisChar);
00252 }
00253 break;
00254 case RightRoundBracket:
00255 if ( !doSimpleRoundBracket( parentSize, mySize ) ) {
00256 drawBigRoundBracket( painter, style, rightRoundBracket, myX, myY, mySize );
00257 }
00258 else {
00259 drawCharacter(painter, style, myX, myY, mySize, rightParenthesisChar);
00260 }
00261 break;
00262 case EmptyBracket:
00263 break;
00264 case Integral:
00265 drawCharacter(painter, style, myX, myY, qRound( 1.5*mySize ), integralChar);
00266 break;
00267 case Sum:
00268 drawCharacter(painter, style, myX, myY, qRound( 1.5*mySize ), summationChar);
00269 break;
00270 case Product:
00271 drawCharacter(painter, style, myX, myY, qRound( 1.5*mySize ), productChar);
00272 break;
00273 }
00274
00275
00276
00277
00278
00279 }
00280
00281
00282 KFORMULA_NAMESPACE_END