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 "esstixfontstyle.h"
00028
00029
00030 KFORMULA_NAMESPACE_BEGIN
00031
00032 #include "esstixfontmapping.cc"
00033
00034 bool EsstixFontStyle::init( ContextStyle* context )
00035 {
00036 SymbolTable* st = symbolTable();
00037 st->init( context );
00038
00039 SymbolTable::NameTable tempNames;
00040 fillNameTable( tempNames );
00041
00042 st->initFont( esstixeightMap, "esstixeight", tempNames );
00043 st->initFont( esstixelevenMap, "esstixeleven", tempNames );
00044 st->initFont( esstixfifteenMap, "esstixfifteen", tempNames );
00045 st->initFont( esstixfiveMap, "esstixfive", tempNames );
00046 st->initFont( esstixfourMap, "esstixfour", tempNames );
00047 st->initFont( esstixfourteenMap, "esstixfourteen", tempNames );
00048 st->initFont( esstixnineMap, "esstixnine", tempNames );
00049 st->initFont( esstixoneMap, "esstixone", tempNames );
00050 st->initFont( esstixsevenMap, "esstixseven", tempNames );
00051 st->initFont( esstixseventeenMap, "esstixseventeen", tempNames );
00052 st->initFont( esstixsixMap, "esstixsix", tempNames );
00053 st->initFont( esstixsixteenMap, "esstixsixteen", tempNames );
00054 st->initFont( esstixtenMap, "esstixten", tempNames );
00055 st->initFont( esstixthirteenMap, "esstixthirteen", tempNames );
00056 st->initFont( esstixthreeMap, "esstixthree", tempNames );
00057 st->initFont( esstixtwelveMap, "esstixtwelve", tempNames );
00058 st->initFont( esstixtwoMap, "esstixtwo", tempNames );
00059
00060 return true;
00061 }
00062
00063
00064 const AlphaTable* EsstixFontStyle::alphaTable() const
00065 {
00066 return &m_alphaTable;
00067 }
00068
00069
00070 Artwork* EsstixFontStyle::createArtwork( SymbolType type ) const
00071 {
00072 return new EsstixArtwork( type );
00073 }
00074
00075
00076 EsstixAlphaTable::EsstixAlphaTable()
00077 : script_font( "esstixthirteen" ),
00078 fraktur_font( "esstixfifteen" ),
00079 double_struck_font( "esstixfourteen" )
00080 {
00081 }
00082
00083
00084 AlphaTableEntry EsstixAlphaTable::entry( short pos,
00085 CharFamily family,
00086 CharStyle ) const
00087 {
00088 AlphaTableEntry entry;
00089
00090
00091 switch( family ) {
00092
00093 case scriptFamily:
00094 if ( ( ( pos >= 'A' ) && ( pos <= 'Z' ) ) ||
00095 ( ( pos >= 'a' ) && ( pos <= 'z' ) ) ) {
00096 entry.pos = pos;
00097 entry.font = script_font;
00098 }
00099 break;
00100 case frakturFamily:
00101 if ( ( ( pos >= 'A' ) && ( pos <= 'Z' ) ) ||
00102 ( ( pos >= 'a' ) && ( pos <= 'z' ) ) ) {
00103 entry.pos = pos;
00104 entry.font = fraktur_font;
00105 }
00106 break;
00107 case doubleStruckFamily:
00108 if ( ( ( pos >= 'A' ) && ( pos <= 'Z' ) ) ||
00109 ( ( pos >= '0' ) && ( pos <= '9' ) ) ) {
00110 entry.pos = pos;
00111 entry.font = double_struck_font;
00112 }
00113 break;
00114 default:
00115 break;
00116 }
00117
00118 return entry;
00119 }
00120
00121
00122 static const char esstixseven_LeftSquareBracket = 0x3f;
00123 static const char esstixseven_RightSquareBracket = 0x40;
00124 static const char esstixseven_LeftCurlyBracket = 0x41;
00125 static const char esstixseven_RightCurlyBracket = 0x42;
00126 static const char esstixseven_LeftCornerBracket = 0x43;
00127 static const char esstixseven_RightCornerBracket = 0x44;
00128 static const char esstixseven_LeftRoundBracket = 0x3d;
00129 static const char esstixseven_RightRoundBracket = 0x3e;
00130
00131
00132 static const char esstixseven_LeftLineBracket = 0x4b;
00133 static const char esstixseven_RightLineBracket = 0x4b;
00134
00135
00136
00137 static char esstixseven_nextchar( char ch )
00138 {
00139 switch ( ch ) {
00140
00141 case 61: return 33;
00142 case 62: return 35;
00143 case 63: return 36;
00144 case 64: return 37;
00145 case 65: return 38;
00146 case 66: return 40;
00147 case 67: return 41;
00148 case 68: return 42;
00149 case 69: return 43;
00150 case 70: return 44;
00151 case 75: return 45;
00152 case 76: return 47;
00153
00154
00155 case 33: return 48;
00156 case 35: return 49;
00157 case 36: return 50;
00158 case 37: return 51;
00159 case 38: return 52;
00160 case 40: return 53;
00161 case 41: return 54;
00162 case 42: return 55;
00163 case 43: return 56;
00164 case 44: return 57;
00165 case 45: return 58;
00166 case 46: return 59;
00167 case 47: return 60;
00168 }
00169 return 0;
00170 }
00171
00172 EsstixArtwork::EsstixArtwork( SymbolType t )
00173 : Artwork( t ), esstixChar( -1 )
00174 {
00175 }
00176
00177
00178 void EsstixArtwork::calcSizes( const ContextStyle& style,
00179 ContextStyle::TextStyle tstyle,
00180 luPt parentSize )
00181 {
00182 setBaseline( -1 );
00183 esstixChar = -1;
00184 luPt mySize = style.getAdjustedSize( tstyle );
00185
00186 switch (getType()) {
00187 case LeftSquareBracket:
00188 if ( calcEsstixDelimiterSize( style, esstixseven_LeftSquareBracket,
00189 mySize, parentSize ) ) {
00190 return;
00191 }
00192 calcRoundBracket( style, leftSquareBracket, parentSize, mySize );
00193 break;
00194 case RightSquareBracket:
00195 if ( calcEsstixDelimiterSize( style, esstixseven_RightSquareBracket,
00196 mySize, parentSize ) ) {
00197 return;
00198 }
00199 calcRoundBracket( style, rightSquareBracket, parentSize, mySize );
00200 break;
00201 case LeftLineBracket:
00202 if ( calcEsstixDelimiterSize( style, esstixseven_LeftLineBracket,
00203 mySize, parentSize ) ) {
00204 return;
00205 }
00206 calcRoundBracket( style, leftLineBracket, parentSize, mySize );
00207 break;
00208 case RightLineBracket:
00209 if ( calcEsstixDelimiterSize( style, esstixseven_RightLineBracket,
00210 mySize, parentSize ) ) {
00211 return;
00212 }
00213 calcRoundBracket( style, rightLineBracket, parentSize, mySize );
00214 break;
00215 case SlashBracket:
00216
00217 break;
00218 case BackSlashBracket:
00219
00220 break;
00221 case LeftCornerBracket:
00222 if ( calcEsstixDelimiterSize( style, esstixseven_LeftCornerBracket,
00223 mySize, parentSize ) ) {
00224 return;
00225 }
00226 calcCharSize(style, mySize, leftAngleBracketChar);
00227 break;
00228 case RightCornerBracket:
00229 if ( calcEsstixDelimiterSize( style, esstixseven_RightCornerBracket,
00230 mySize, parentSize ) ) {
00231 return;
00232 }
00233 calcCharSize(style, mySize, rightAngleBracketChar);
00234 break;
00235 case LeftRoundBracket:
00236 if ( calcEsstixDelimiterSize( style, esstixseven_LeftRoundBracket,
00237 mySize, parentSize ) ) {
00238 return;
00239 }
00240 calcRoundBracket( style, leftRoundBracket, parentSize, mySize );
00241 break;
00242 case RightRoundBracket:
00243 if ( calcEsstixDelimiterSize( style, esstixseven_RightRoundBracket,
00244 mySize, parentSize ) ) {
00245 return;
00246 }
00247 calcRoundBracket( style, rightRoundBracket, parentSize, mySize );
00248 break;
00249 case EmptyBracket:
00250 setHeight(parentSize);
00251
00252 setWidth(0);
00253 break;
00254 case LeftCurlyBracket:
00255 if ( calcEsstixDelimiterSize( style, esstixseven_LeftCurlyBracket,
00256 mySize, parentSize ) ) {
00257 return;
00258 }
00259 calcCurlyBracket( style, leftCurlyBracket, parentSize, mySize );
00260 break;
00261 case RightCurlyBracket:
00262 if ( calcEsstixDelimiterSize( style, esstixseven_RightCurlyBracket,
00263 mySize, parentSize ) ) {
00264 return;
00265 }
00266 calcCurlyBracket( style, rightCurlyBracket, parentSize, mySize );
00267 break;
00268 case Integral:
00269 calcCharSize( style, qRound( 1.5*mySize ), integralChar );
00270 break;
00271 case Sum:
00272 calcCharSize( style, qRound( 1.5*mySize ), summationChar );
00273 break;
00274 case Product:
00275 calcCharSize( style, qRound( 1.5*mySize ), productChar );
00276 break;
00277 }
00278 }
00279
00280
00281 void EsstixArtwork::draw(QPainter& painter, const LuPixelRect& r,
00282 const ContextStyle& style, ContextStyle::TextStyle tstyle,
00283 luPt , const LuPixelPoint& origin)
00284 {
00285 luPt mySize = style.getAdjustedSize( tstyle );
00286 luPixel myX = origin.x() + getX();
00287 luPixel myY = origin.y() + getY();
00288 if ( !LuPixelRect( myX, myY, getWidth(), getHeight() ).intersects( r ) )
00289 return;
00290
00291 painter.setPen(style.getDefaultColor());
00292
00293
00294 switch (getType()) {
00295 case LeftSquareBracket:
00296 if ( esstixChar != -1 ) {
00297 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00298 }
00299 else {
00300 drawBigRoundBracket( painter, style, leftSquareBracket, myX, myY, mySize );
00301 }
00302 break;
00303 case RightSquareBracket:
00304 if ( esstixChar != -1 ) {
00305 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00306 }
00307 else {
00308 drawBigRoundBracket( painter, style, rightSquareBracket, myX, myY, mySize );
00309 }
00310 break;
00311 case LeftCurlyBracket:
00312 if ( esstixChar != -1 ) {
00313 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00314 }
00315 else {
00316 drawBigCurlyBracket( painter, style, leftCurlyBracket, myX, myY, mySize );
00317 }
00318 break;
00319 case RightCurlyBracket:
00320 if ( esstixChar != -1 ) {
00321 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00322 }
00323 else {
00324 drawBigCurlyBracket( painter, style, rightCurlyBracket, myX, myY, mySize );
00325 }
00326 break;
00327 case LeftLineBracket:
00328 if ( esstixChar != -1 ) {
00329 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00330 }
00331 else {
00332 drawBigRoundBracket( painter, style, leftLineBracket, myX, myY, mySize );
00333 }
00334 break;
00335 case RightLineBracket:
00336 if ( esstixChar != -1 ) {
00337 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00338 }
00339 else {
00340 drawBigRoundBracket( painter, style, rightLineBracket, myX, myY, mySize );
00341 }
00342 break;
00343 case SlashBracket:
00344
00345 break;
00346 case BackSlashBracket:
00347
00348 break;
00349 case LeftCornerBracket:
00350 if ( esstixChar != -1 ) {
00351 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00352 }
00353 else drawCharacter(painter, style, myX, myY, mySize, leftAngleBracketChar);
00354 break;
00355 case RightCornerBracket:
00356 if ( esstixChar != -1 ) {
00357 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00358 }
00359 else drawCharacter(painter, style, myX, myY, mySize, rightAngleBracketChar);
00360 break;
00361 case LeftRoundBracket:
00362 if ( esstixChar != -1 ) {
00363 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00364 }
00365 else {
00366 drawBigRoundBracket( painter, style, leftRoundBracket, myX, myY, mySize );
00367 }
00368 break;
00369 case RightRoundBracket:
00370 if ( esstixChar != -1 ) {
00371 drawEsstixDelimiter( painter, style, myX, myY, mySize );
00372 }
00373 else {
00374 drawBigRoundBracket( painter, style, rightRoundBracket, myX, myY, mySize );
00375 }
00376 break;
00377 case EmptyBracket:
00378 break;
00379 case Integral:
00380 drawCharacter(painter, style, myX, myY, qRound( 1.5*mySize ), integralChar);
00381 break;
00382 case Sum:
00383 drawCharacter(painter, style, myX, myY, qRound( 1.5*mySize ), summationChar);
00384 break;
00385 case Product:
00386 drawCharacter(painter, style, myX, myY, qRound( 1.5*mySize ), productChar);
00387 break;
00388 }
00389
00390
00391
00392
00393
00394 }
00395
00396
00397 bool EsstixArtwork::isNormalChar() const
00398 {
00399 return Artwork::isNormalChar() && ( fontSizeFactor == 1 );
00400 }
00401
00402
00403 bool EsstixArtwork::calcEsstixDelimiterSize( const ContextStyle& context,
00404 char c,
00405 luPt fontSize,
00406 luPt parentSize )
00407 {
00408 QFont f( "esstixseven" );
00409
00410 for ( char i=1; c != 0; ++i ) {
00411
00412 f.setPointSizeFloat( context.layoutUnitPtToPt( i*fontSize ) );
00413 QFontMetrics fm( f );
00414 LuPixelRect bound = fm.boundingRect( c );
00415
00416 luPt height = context.ptToLayoutUnitPt( bound.height() );
00417 if ( height >= parentSize ) {
00418 luPt width = context.ptToLayoutUnitPt( fm.width( c ) );
00419 luPt baseline = context.ptToLayoutUnitPt( -bound.top() );
00420
00421 esstixChar = c;
00422 fontSizeFactor = i;
00423
00424 setHeight( height );
00425 setWidth( width );
00426 setBaseline( baseline );
00427
00428 return true;
00429 }
00430 c = esstixseven_nextchar( c );
00431 }
00432
00433
00434 return false;
00435 }
00436
00437
00438 void EsstixArtwork::drawEsstixDelimiter( QPainter& painter, const ContextStyle& style,
00439 luPixel x, luPixel y,
00440 luPt height )
00441 {
00442 QFont f( "esstixseven" );
00443 f.setPointSizeFloat( style.layoutUnitToFontSize( fontSizeFactor*height, false ) );
00444
00445 painter.setFont( f );
00446 painter.drawText( style.layoutUnitToPixelX( x ),
00447 style.layoutUnitToPixelY( y + getBaseline() ),
00448 QString( QChar( esstixChar ) ) );
00449 }
00450
00451
00452 KFORMULA_NAMESPACE_END