diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
| commit | 7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch) | |
| tree | 4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/gtfont.cpp | |
| download | scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip | |
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/gtfont.cpp')
| -rw-r--r-- | scribus/gtfont.cpp | 758 |
1 files changed, 758 insertions, 0 deletions
diff --git a/scribus/gtfont.cpp b/scribus/gtfont.cpp new file mode 100644 index 0000000..227691d --- /dev/null +++ b/scribus/gtfont.cpp @@ -0,0 +1,758 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ +/*************************************************************************** + * Copyright (C) 2004 by Riku Leino * + * tsoots@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "gtfont.h" + +const QString gtFont::fontWeights[FontWeightMAX] = +{ + "", + "Demi Bold", + "Extra Black", + "Extra Bold", + "Extra Heavy", + "Extra Light", + "Semi Bold", + "Black", + "Bold", + "Book", + "Demi", + "Heavy", + "Light", + "Lite", + "Medium", + "Regular", + "Roman" +}; + +const QString gtFont::fontSlants[FontSlantMAX] = +{ + "", + "Italic", + "Oblique" +}; + +const QString gtFont::fontWidths[FontWidthMAX] = +{ + "", + "Extra Condensed", + "Semi Condensed", + "Ultra Condensed", + "Extra Compressed", + "Semi Compressed", + "Ultra Compressed", + "Condensed", + "Compressed" +}; + +gtFont::gtFont() +{ + setflags = 0; + noEffects(); + name = ""; + family = ""; + weight = ""; + slant = ""; + width = ""; + append = ""; + size = 120; + color = "Black"; + shade = 100; + strokeColor = "Black"; + strokeShade = 100; + hscale = 1000; + kerning = 0; + useFullName = true; + weightIndex = 0; + slantIndex = 1; + widthIndex = 2; + smallestIndex = -1; + biggestIndex = - 1; + index = -1; + tmpWeightIndex = -1; + tmpSlantIndex = -1; + tmpWidthIndex = -1; +} + +gtFont::gtFont(const gtFont& f) +{ + name = f.name; + family = f.family; + weight = f.weight; + slant = f.slant; + width = f.width; + append = f.append; + size = f.size; + color = f.color; + shade = f.shade; + strokeColor = f.strokeColor; + strokeShade = f.strokeShade; + hscale = f.hscale; + kerning = f.kerning; + useFullName = f.useFullName; + weightIndex = f.weightIndex; + slantIndex = f.slantIndex; + widthIndex = f.widthIndex; + smallestIndex = f.smallestIndex; + biggestIndex = f.biggestIndex; + index = f.index; + tmpWeightIndex = f.tmpWeightIndex; + tmpSlantIndex = f.tmpSlantIndex; + tmpWidthIndex = f.tmpWidthIndex; + fontEffects[NORMAL] = f.fontEffects[NORMAL]; + fontEffects[UNDERLINE] = f.fontEffects[UNDERLINE]; + fontEffects[STRIKETHROUGH] = f.fontEffects[STRIKETHROUGH]; + fontEffects[SMALL_CAPS] = f.fontEffects[SMALL_CAPS]; + fontEffects[SUPERSCRIPT] = f.fontEffects[SUPERSCRIPT]; + fontEffects[SUBSCRIPT] = f.fontEffects[SUBSCRIPT]; + fontEffects[OUTLINE] = f.fontEffects[OUTLINE]; + setflags = f.setflags; +} + +int gtFont::getFlags() +{ + return setflags; +} + +bool gtFont::isToggled(FontEffect fe) +{ + return fontEffects[fe]; +} + +bool gtFont::toggleEffect(FontEffect fe) +{ + switch (fe) + { + case NORMAL: + if (!fontEffects[NORMAL]) + noEffects(); + break; + case SUPERSCRIPT: + fontEffects[SUPERSCRIPT] = !fontEffects[SUPERSCRIPT]; + if (fontEffects[SUPERSCRIPT]) + { + fontEffects[SUBSCRIPT] = false; + fontEffects[NORMAL] = false; + } + break; + case SUBSCRIPT: + fontEffects[SUBSCRIPT] = !fontEffects[SUBSCRIPT]; + if (fontEffects[SUBSCRIPT]) + { + fontEffects[SUPERSCRIPT] = false; + fontEffects[NORMAL] = false; + } + break; + default: + fontEffects[fe] = !fontEffects[fe]; + if (fontEffects[fe]) + fontEffects[NORMAL] = false; + } + setflags |= effectWasSet; + return fontEffects[fe]; +} + +int gtFont::getEffectsValue() +{ + int b = 0; + if (isToggled(NORMAL)) + b = 0; + if (isToggled(UNDERLINE)) + b |= 8; + if (isToggled(STRIKETHROUGH)) + b |= 16; + if (isToggled(SMALL_CAPS)) + b |= 64; + if (isToggled(SUPERSCRIPT)) + b |= 1; + if (isToggled(SUBSCRIPT)) + b |= 2; + if (isToggled(OUTLINE)) + b |= 4; + return b; +} + +void gtFont::setName(QString newName) +{ + name = newName; + setWeight(NO_WEIGHT); + setSlant(NO_SLANT); + setWidth(NO_WIDTH); + parseName(); + useFullName = true; + setflags |= familyWasSet; +} + +void gtFont::setFamily(QString newFamily) +{ + family = newFamily; + useFullName = false; + setflags |= familyWasSet; +} + +QString gtFont::getFamily() +{ + return family; +} + +void gtFont::setWeight(FontWeight newWeight) +{ + weight = fontWeights[newWeight]; + useFullName = false; + setflags |= weightWasSet; + if ((newWeight == ROMAN) || (newWeight == REGULAR)) + { + setSlant(NO_SLANT); + setWidth(NO_WIDTH); + setflags &= ~weightWasSet; + } + if (weightIndex < 0) + { + weightIndex = 0; + slantIndex = 1; + widthIndex = 2; + } +} + +void gtFont::setWeight(QString newWeight) +{ + weight = newWeight; + useFullName = false; + setflags |= weightWasSet; + if ((newWeight == fontWeights[ROMAN]) || + (newWeight == fontWeights[REGULAR])) + { + setSlant(NO_SLANT); + setWidth(NO_WIDTH); + setflags &= ~weightWasSet; + } + if (weightIndex < 0) + { + weightIndex = 0; + slantIndex = 1; + widthIndex = 2; + } +} + +QString gtFont::getWeight() +{ + return weight; +} + +void gtFont::setSlant(FontSlant newSlant) +{ + slant = fontSlants[newSlant]; + useFullName = false; + setflags &= ~slantWasSet; + if (newSlant != NO_SLANT) + { + if (weight == fontWeights[REGULAR]) + setWeight(NO_WEIGHT); + else if (weight == fontWeights[ROMAN]) + setWeight(NO_WEIGHT); + setflags |= slantWasSet; + } + if (slantIndex < 0) + { + weightIndex = 0; + slantIndex = 1; + widthIndex = 2; + } +} + +void gtFont::setSlant(QString newSlant) +{ + slant = newSlant; + useFullName = false; + setflags &= ~slantWasSet; + if (!newSlant.isEmpty()) + { + if (weight == fontWeights[REGULAR]) + setWeight(NO_WEIGHT); + else if (weight == fontWeights[ROMAN]) + setWeight(NO_WEIGHT); + setflags |= slantWasSet; + } + if (slantIndex < 0) + { + weightIndex = 0; + slantIndex = 1; + widthIndex = 2; + } +} + +QString gtFont::getSlant() +{ + return slant; +} + +void gtFont::setWidth(FontWidth newWidth) +{ + width = fontWidths[newWidth]; + useFullName = false; + setflags &= ~widthWasSet; + if (newWidth != NO_WIDTH) + { + if (weight == fontWeights[REGULAR]) + setWeight(NO_WEIGHT); + else if (weight == fontWeights[ROMAN]) + setWeight(NO_WEIGHT); + setflags |= widthWasSet; + } + if (widthIndex < 0) + { + weightIndex = 0; + slantIndex = 1; + widthIndex = 2; + } +} + +void gtFont::setWidth(QString newWidth) +{ + width = newWidth; + useFullName = false; + setflags &= ~widthWasSet; + if (!newWidth.isEmpty()) + { + if (weight == fontWeights[REGULAR]) + setWeight(NO_WEIGHT); + else if (weight == fontWeights[ROMAN]) + setWeight(NO_WEIGHT); + setflags |= widthWasSet; + } + if (widthIndex < 0) + { + weightIndex = 0; + slantIndex = 1; + widthIndex = 2; + } +} + +QString gtFont::getWidth() +{ + return width; +} + +void gtFont::setSize(int newSize) +{ + size = newSize; + setflags |= sizeWasSet; +} + +void gtFont::setSize(double newSize) +{ + size = static_cast<int>(newSize); + setflags |= sizeWasSet; +} + +void gtFont::setColor(QString newColor) +{ + color = newColor; + setflags |= fillColorWasSet; +} + +void gtFont::setShade(int newShade) +{ + shade = newShade; + setflags |= fillShadeWasSet; +} + +void gtFont::setStrokeColor(QString newColor) +{ + strokeColor = newColor; + setflags |= strokeColorWasSet; +} + +void gtFont::setStrokeShade(int newShade) +{ + strokeShade = newShade; + setflags |= strokeShadeWasSet; +} + +QString gtFont::getName() +{ + if (useFullName) + return name; + + QString name2 = family + " "; + + if (weightIndex == 0) + name2 += weight + " "; + else if (slantIndex == 0) + name2 += slant + " "; + else if (widthIndex == 0) + name2 += width + " "; + + if (weightIndex == 1) + name2 += weight + " "; + else if (slantIndex == 1) + name2 += slant + " "; + else if (widthIndex == 1) + name2 += width + " "; + + if (weightIndex == 2) + name2 += weight + " "; + else if (slantIndex == 2) + name2 += slant + " "; + else if (widthIndex == 2) + name2 += width + " "; + + name2 += append; + name2 = name2.simplified(); + return name2; +} + +QString gtFont::getName(uint i) +{ + QString fname = family + " "; + switch (i) + { + case 0: + fname = fname + weight + " " + slant + " " + width + " " + append; + break; + case 1: + fname = fname + weight + " " + width + " " + slant + " " + append; + break; + case 2: + fname = fname + slant + " " + weight + " " + width + " " + append; + break; + case 3: + fname = fname + slant + " " + width + " " + weight + " " + append; + break; + case 4: + fname = fname + width + " " + weight + " " + slant + " " + append; + break; + case 5: + fname = fname + width + " " + slant + " " + weight + " " + append; + break; + case 6: + fname = fname + " " + append + " " + weight + " " + slant + " " + width; + break; + case 7: + fname = fname + " " + append + " " + weight + " " + width + " " + slant; + break; + case 8: + fname = fname + " " + append + " " + slant + " " + weight + " " + width; + break; + case 9: + fname = fname + " " + append + " " + slant + " " + width + " " + weight; + break; + case 10: + fname = fname + " " + append + " " + width + " " + weight + " " + slant; + break; + case 11: + fname = fname + " " + append + " " + width + " " + slant + " " + weight; + break; + case 12: + if ((append.isEmpty()) && (weight.isEmpty()) && (slant.isEmpty()) && (width.isEmpty())) + fname = fname + " " + fontWeights[REGULAR]; + break; + case 13: + if ((append.isEmpty()) && (weight.isEmpty()) && (slant.isEmpty()) && (width.isEmpty())) + fname = fname + " " + fontWeights[ROMAN]; + break; + } + fname = fname.simplified(); + return fname; +} + +int gtFont::getSize() +{ + return size; +} + +QString gtFont::getColor() +{ + return color; +} + +int gtFont::getShade() +{ + return shade; +} + +QString gtFont::getStrokeColor() +{ + return strokeColor; +} + +int gtFont::getStrokeShade() +{ + return strokeShade; +} + +void gtFont::noEffects() +{ + fontEffects[NORMAL] = true; + fontEffects[UNDERLINE] = false; + fontEffects[STRIKETHROUGH] = false; + fontEffects[SMALL_CAPS] = false; + fontEffects[SUPERSCRIPT] = false; + fontEffects[SUBSCRIPT] = false; + fontEffects[OUTLINE] = false; + setflags &= ~effectWasSet; +} + +int gtFont::getHscale() +{ + return hscale; +} + +void gtFont::setHscale(int newHscale) +{ + hscale = newHscale; + setflags |= hscaleWasSet; +} + +int gtFont::getKerning() +{ + return kerning; +} + +void gtFont::setKerning(int newKerning) +{ + kerning = newKerning; + setflags |= kerningWasSet; +} + +void gtFont::parseName() +{ + smallestIndex = -1; + biggestIndex = - 1; + index = -1; + tmpWeightIndex = -1; + tmpSlantIndex = -1; + tmpWidthIndex = -1; + parseWeight(); + parseSlant(); + parseWidth(); + parseFamily(); +} + +void gtFont::parseWeight() +{ + bool found = false; + for (int i = 1; i < FontWeightMAX; ++i) + { + index = name.indexOf(fontWeights[i]); // f.e. Demi Bold + QString tmpWeight = ""; + if ((index == -1) && (fontWeights[i].indexOf(" ") != -1) && (fontWeights[i].indexOf(" ") != 1)) + { + QString fw2 = fontWeights[i]; + fw2.replace(" ", "-"); // f.e. Demi-Bold + index = name.indexOf(fw2); + if (index == -1) + { + fw2 = fontWeights[i]; + fw2.replace(" ", ""); // f.e. DemiBold + index = name.indexOf(fw2); + if (index == -1) + { + fw2 = fontWeights[i]; + fw2.replace(" B", " b"); // f.e. Demibold + fw2.replace(" C", " c"); + fw2.replace(" H", " h"); + fw2.replace(" L", " l"); + fw2.replace(" ", ""); + index = name.indexOf(fw2); + if (index != -1) + tmpWeight = fw2; + } + else + tmpWeight = fw2; + } + else + { + tmpWeight = fw2; + } + } + else + tmpWeight = fontWeights[i]; + if (index != -1) + { + weight = tmpWeight; + if (smallestIndex == -1 || smallestIndex > index) + smallestIndex = index; + if ((biggestIndex == -1) || (biggestIndex < index + static_cast<int>(tmpWeight.length()) - 1)) + biggestIndex = index + tmpWeight.length(); + found = true; + tmpWeightIndex = index; + break; + } + } + if (!found) + weight = fontWeights[NO_WEIGHT]; +} + +void gtFont::parseSlant() +{ + bool found = false; + for (int i = 1; i < FontSlantMAX; ++i) + { + index = name.indexOf(fontSlants[i]); + if (index != -1) + { + slant = fontSlants[i]; + if (smallestIndex == -1 || smallestIndex > index) + smallestIndex = index; + if ((biggestIndex == -1) || (biggestIndex < index + static_cast<int>(slant.length()) - 1)) + biggestIndex = index + slant.length(); + found = true; + tmpSlantIndex = index; + break; + } + } + if (!found) + slant = fontSlants[NO_SLANT]; +} + +void gtFont::parseWidth() +{ + bool found = false; + for (int i = 1; i < FontWidthMAX; ++i) + { + index = name.indexOf(fontWidths[i]); + QString tmpWidth = ""; + if ((index == -1) && (fontWidths[i].indexOf(" ") != -1) && (fontWidths[i].indexOf(" ") != 1)) + { + QString fw2 = fontWidths[i]; + fw2.replace(" ", "-"); + index = name.indexOf(fw2); + if (index == -1) + { + fw2 = fontWidths[i]; + fw2.replace(" ", ""); + index = name.indexOf(fw2); + if (index == -1) + { + fw2 = fontWidths[i]; + fw2.replace(" B", " b"); + fw2.replace(" C", " c"); + fw2.replace(" H", " h"); + fw2.replace(" L", " l"); + fw2.replace(" ", ""); + index = name.indexOf(fw2); + if (index != -1) + tmpWidth = fw2; + } + else + tmpWidth = fw2; + } + else + { + tmpWidth = fw2; + } + } + else + tmpWidth = fontWidths[i]; + if (index != -1) + { + width = tmpWidth; + if (smallestIndex == -1 || smallestIndex > index) + smallestIndex = index; + if ((biggestIndex == -1) || (biggestIndex < index + static_cast<int>(tmpWidth.length()) - 1)) + biggestIndex = index + tmpWidth.length(); + found = true; + tmpWidthIndex = index; + break; + } + } + if (!found) + width = fontWidths[NO_WIDTH]; +} + +void gtFont::parseFamily() +{ + if (tmpWeightIndex < tmpSlantIndex) + { + weightIndex = 0; + slantIndex = 1; + if (tmpWidthIndex < tmpWeightIndex) + { + widthIndex = 0; + weightIndex = 1; + slantIndex = 2; + } + else if (tmpWidthIndex < tmpSlantIndex) + { + widthIndex = 1; + slantIndex = 2; + } + else + widthIndex = 2; + } + else if (tmpWeightIndex > tmpSlantIndex) + { + slantIndex = 0; + weightIndex = 1; + if (tmpWidthIndex < tmpSlantIndex) + { + widthIndex = 0; + slantIndex = 1; + weightIndex = 2; + } + else if (tmpWidthIndex < tmpWeightIndex) + { + widthIndex = 1; + weightIndex = 2; + } + else + widthIndex = 2; + } + else + { + weightIndex = -2; + widthIndex = -1; + slantIndex = 0; + } + + if (smallestIndex == -1) + family = name; + else + family = name.left(smallestIndex); + if (biggestIndex == -1 || biggestIndex >= name.length()) + append = ""; + else + append = name.right(name.length() - biggestIndex - 1); + family = family.trimmed(); +} + +int gtFont::find(const QString& where, const QString& what) +{ + QString realWhat = " " + what; + int index = where.lastIndexOf(realWhat); // f.e. Demi Bold + if (index != -1) + { + if (index + realWhat.length() != where.length()) + if (where[index + realWhat.length() + 1] != ' ') + index = -1; + } + return index; +} + +gtFont::~gtFont() +{ + +} |
