Files
libreoffice/vcl/ios/source/gdi/salgdi.cxx
2012-04-15 11:56:48 +02:00

261 lines
8.7 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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 Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#include "ios/common.h"
#include "ios/salframe.h"
#include "ios/salgdi.h"
#include "ios/salcoretextstyle.hxx"
#include "ios/salcoretextlayout.hxx"
IosSalGraphics::IosSalGraphics()
: mpFrame( NULL )
, mxLayer( NULL )
, mrContext( NULL )
, mpXorEmulation( NULL )
, mnXorMode( 0 )
, mnWidth( 0 )
, mnHeight( 0 )
, mnBitmapDepth( 0 )
, mnRealDPIX( 0 )
, mnRealDPIY( 0 )
, mfFakeDPIScale( 1.0 )
, mxClipPath( NULL )
, maLineColor( COL_WHITE )
, maFillColor( COL_BLACK )
, m_pCoreTextFontData( NULL )
, mbNonAntialiasedText( false )
, mbPrinter( false )
, mbVirDev( false )
, mbWindow( false )
{
msgs_debug(gr,"-->");
m_style = new CoreTextStyleInfo();
msgs_debug(gr,"m_style=%p <--", m_style);
}
IosSalGraphics::~IosSalGraphics()
{
msgs_debug(gr,"-->");
if(m_style)
{
delete m_style;
m_style = NULL;
}
msgs_debug(gr,"<--");
}
inline bool IosSalGraphics::AddTempDevFont( ImplDevFontList*,
const rtl::OUString& ,
const rtl::OUString& )
{
OSL_ASSERT( FALSE );
return false;
}
void IosSalGraphics::DrawServerFontLayout( const ServerFontLayout& )
{
}
void IosSalGraphics::FreeEmbedFontData( const void* pData, long /*nDataLen*/ )
{
// TODO: implementing this only makes sense when the implementation of
// IosSalGraphics::GetEmbedFontData() returns non-NULL
(void)pData;
DBG_ASSERT( (pData!=NULL), "IosSalGraphics::FreeEmbedFontData() is not implemented\n");
}
void IosSalGraphics::GetDevFontList( ImplDevFontList* pFontList )
{
DBG_ASSERT( pFontList, "IosSalGraphics::GetDevFontList(NULL) !");
SalData* pSalData = GetSalData();
if (pSalData->mpFontList == NULL)
{
pSalData->mpFontList = new SystemFontList();
}
// Copy all ImplFontData objects contained in the SystemFontList
pSalData->mpFontList->AnnounceFonts( *pFontList );
}
void IosSalGraphics::GetDevFontSubstList( OutputDevice* )
{
// nothing to do since there are no device-specific fonts on Ios
}
const void* IosSalGraphics::GetEmbedFontData( const ImplFontData*,
const sal_Ucs* /*pUnicodes*/,
sal_Int32* /*pWidths*/,
FontSubsetInfo&,
long* /*pDataLen*/ )
{
return NULL;
}
const Ucs2SIntMap* IosSalGraphics::GetFontEncodingVector(const ImplFontData*,
const Ucs2OStrMap** /*ppNonEncoded*/ )
{
return NULL;
}
void IosSalGraphics::GetFontMetric( ImplFontMetricData* pMetric, int nFallbackLevel )
{
(void)nFallbackLevel; // glyph-fallback on CoreText is done differently -> no fallback level
pMetric->mbScalableFont = true;
pMetric->mbKernableFont = true;
CTFontRef font = m_style->GetFont();
DBG_ASSERT(font, "GetFontMetric without font set in style");
pMetric->mnAscent = static_cast<long>( CTFontGetAscent(font) * mfFakeDPIScale + 0.5);
pMetric->mnDescent = static_cast<long>(CTFontGetDescent(font) * mfFakeDPIScale + 0.5);
const long nExtDescent = static_cast<long>((CTFontGetLeading(font) + CTFontGetDescent(font)) *
mfFakeDPIScale + 0.5);
pMetric->mnExtLeading = nExtDescent + pMetric->mnDescent;
pMetric->mnIntLeading = 0;
pMetric->mnWidth = m_style->GetFontStretchedSize();
msgs_debug(gr,"ascent=%ld, descent=%ld, extleading=%ld, intleading=%ld,w=%ld",
pMetric->mnAscent, pMetric->mnDescent,
pMetric->mnExtLeading,
pMetric->mnIntLeading,
pMetric->mnWidth);
}
sal_Bool IosSalGraphics::GetGlyphBoundRect( sal_GlyphId /*nGlyphId*/, Rectangle& /*rRect*/ )
{
/* TODO: create a Ghyph iterator to keep track ot 'state' between call */
return false;
}
sal_Bool IosSalGraphics::GetGlyphOutline( sal_GlyphId /*nGlyphId*/, basegfx::B2DPolyPolygon& /*rPolyPoly*/ )
{
/* TODO */
return false;
}
void IosSalGraphics::GetGlyphWidths( const ImplFontData* /*pFontData*/, bool /*bVertical*/,
Int32Vector& /*rGlyphWidths*/, Ucs2UIntMap& /*rUnicodeEnc*/ )
{
}
sal_uLong IosSalGraphics::GetKernPairs( sal_uLong, ImplKernPairData* )
{
return 0;
}
bool IosSalGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const
{
if( !m_pCoreTextFontData )
{
return false;
}
return m_pCoreTextFontData->GetImplFontCapabilities(rFontCapabilities);
}
const ImplFontCharMap* IosSalGraphics::GetImplFontCharMap() const
{
if( !m_pCoreTextFontData )
{
return ImplFontCharMap::GetDefaultMap();
}
return m_pCoreTextFontData->GetImplFontCharMap();
}
bool IosSalGraphics::GetRawFontData( const ImplFontData* pFontData,
std::vector<unsigned char>& rBuffer, bool* pJustCFF )
{
const ImplCoreTextFontData* font_data = static_cast<const ImplCoreTextFontData*>(pFontData);
return font_data->GetRawFontData(rBuffer, pJustCFF);
}
SystemFontData IosSalGraphics::GetSysFontData( int /* nFallbacklevel */ ) const
{
msgs_debug(gr,"-->");
SystemFontData aSysFontData;
aSysFontData.nSize = sizeof( SystemFontData );
aSysFontData.bAntialias = true;
CTFontRef font = CTFontCreateUIFontForLanguage(kCTFontSystemFontType, 0.0, NULL);
font = (CTFontRef)CFRetain(font);
aSysFontData.rCTFont = font;
CTFontRef italic_font = CTFontCreateCopyWithSymbolicTraits( font,
0.0,
NULL,
kCTFontItalicTrait,
kCTFontItalicTrait + kCTFontBoldTrait);
aSysFontData.bFakeItalic = italic_font ? false : true;
SafeCFRelease(italic_font);
CTFontRef bold_font = CTFontCreateCopyWithSymbolicTraits( font,
0.0,
NULL,
kCTFontBoldTrait,
kCTFontItalicTrait + kCTFontBoldTrait);
aSysFontData.bFakeBold = bold_font ? false : true;
SafeCFRelease(bold_font);
CTFontRef vertical_font = CTFontCreateCopyWithSymbolicTraits( font,
0.0,
NULL,
kCTFontVerticalTrait,
kCTFontVerticalTrait);
aSysFontData.bVerticalCharacterType = vertical_font ? true : false;
SafeCFRelease(vertical_font);
msgs_debug(gr,"<--");
return aSysFontData;
}
SalLayout* IosSalGraphics::GetTextLayout( ImplLayoutArgs&, int /*nFallbackLevel*/ )
{
msgs_debug(gr,"-->");
CoreTextLayout* layout = new CoreTextLayout( this, m_style );
msgs_debug(gr,"layout:%p <--", layout);
return layout;
}
sal_uInt16 IosSalGraphics::SetFont( FontSelectPattern* pReqFont, int /*nFallbackLevel*/ )
{
msgs_debug(gr,"m_style=%p -->", m_style);
m_style->SetFont(pReqFont);
msgs_debug(gr,"<--");
return 0;
}
void IosSalGraphics::SetTextColor( SalColor nSalColor )
{
msgs_debug(gr,"m_style=%p -->", m_style);
m_style->SetColor(nSalColor);
msgs_debug(gr,"<--");
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */