blob: 5e23edb8df7f172c9980a49b98f2cff0cb33d7b9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Dmitriy S. Matveev, Viskov Nikolay
*/
#include "Font.h"
#include "Environment.h"
#include "TTFont.h"
#include "T1Font.h"
#include <string.h>
Font::Font() {
_famName = NULL;
}
Font::~Font() {
for( std::map<const uflong, Glyph*>::iterator iter = _glyphMap.begin(); iter != _glyphMap.end(); iter++ ) {
delete iter->second;
}
delete[] _famName;
/*ufshort famLength = fwcslen((fwchar_t *)_famName);
fchar *family = new fchar[famLength+1];
ufshort i;
for (i = 0;i < famLength;i++) {
(family)[i] = _famName[i];
}
(family)[i] = '\0';
FontHeader* fh = GraphicsEnvironment::getAllFonts()->_head;
//printf("\nfaund = -%s-\n", family);
for(fint i=0; i<GraphicsEnvironment::_length; i++){
//printf("font = -%s-\n", fh->_familyName);
if (strcmp(fh->_familyName,family)==0 && fh->_style == _style) {
fh->_font = NULL;
break;
}
fh=fh->_nextHeader;
}
delete[] family;*/
}
Glyph* Font::createGlyph(ufshort unicode, ufshort size){
return NULL;
}
fwchar_t* Font::getPSName()
{
return NULL;
}
ffloat* Font::getLineMetrics()
{
return NULL;
}
fint Font::getMissingGlyphCode()
{
return 0;
}
bool Font::canDisplay(ufshort c)
{
return 0;
}
ufshort Font::getUnicodeByIndex(ufshort ind)
{
return 0;
}
//unicode = 0 - default glyph
Glyph* Font::getGlyph(ufshort unicode, ufshort size) {
uflong id;
//printf("unicode = %lu, size = %lu\n", unicode,size);
if (!canDisplay(unicode)) {
id = (uflong)(size << 16);
unicode = 0;
} else {
id = (uflong)(size << 16) + unicode;
}
//printf("unicode = %lu, size = %lu, id = %lu\n", unicode,size,id);
std::map<const uflong, Glyph*>::iterator iter = _glyphMap.find(id);
if (iter != _glyphMap.end()) {
//printf("return the glyph");
return (Glyph *)(*iter).second;
}
//printf("creation of the glyph");
Glyph *glyph = createGlyph(unicode, size);
_glyphMap[id] = glyph;
return glyph;
}
// Creation of font depending on font type
Font* createFont(fchar* family, StyleName sn) {
fint nLen = (fint) strlen(family);
fwchar_t* name = new fwchar_t[nLen+1];
for (fint i = 0; i <= nLen; i++)
name[i] = family[i];
Font* retFont = createFont(name, sn);
delete[] name;
return retFont;
}
// Creation of font depending on font type
Font* createFont(fwchar_t* family, StyleName sn)
{
Font* retFont;
bool isFound = false;
if (Environment::getAllFonts() == NULL) return NULL;
for(FontHeader* fh = Environment::getAllFonts();
fh != NULL; fh=fh->_nextHeader)
{
if (fwcscmp(fh->_familyName,family)==0 && fh->_style == sn)
{
switch(fh->_fType)
{
case TrueType:
retFont = new TTFont(fh->_filePath);
fh->_font=retFont;
break;
case Type1:
retFont = new T1Font(family,sn,fh->_filePath);
fh->_font=retFont;
break;
}
isFound = true;
break;
}
}
if (!isFound)
{
// printf("Font not found");
return 0; //Font not found
}
return retFont;
}