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