Kaydet (Commit) 5aaef822 authored tarafından Norbert Thiebaud's avatar Norbert Thiebaud

coretext: use only the FontFace ref from the Style

Change-Id: I696065f6f60fb55eaa24e4a8b4cbff1e93856f04
Reviewed-on: https://gerrit.libreoffice.org/306Reviewed-by: 's avatarNorbert Thiebaud <nthiebaud@gmail.com>
Tested-by: 's avatarNorbert Thiebaud <nthiebaud@gmail.com>
üst f49db879
...@@ -196,24 +196,31 @@ SystemFontList::SystemFontList() ...@@ -196,24 +196,31 @@ SystemFontList::SystemFontList()
{ {
CFArrayRef font_descriptors = CTFontCollectionCreateMatchingFontDescriptors(font_collection); CFArrayRef font_descriptors = CTFontCollectionCreateMatchingFontDescriptors(font_collection);
for(int i = 0; i < CFArrayGetCount(font_descriptors); i++) if(font_descriptors)
{ {
CTFontDescriptorRef font_descriptor = (CTFontDescriptorRef)CFArrayGetValueAtIndex(font_descriptors, i); for(int i = 0; i < CFArrayGetCount(font_descriptors); i++)
CTFontRef font = CTFontCreateWithFontDescriptor(font_descriptor, 0, NULL);
ImplDevFontAttributes devfont_attr;
if(GetDevFontAttributes( font_descriptor, devfont_attr ) )
{ {
CoreTextPhysicalFontFace* font_data = new CoreTextPhysicalFontFace(devfont_attr, font); CTFontDescriptorRef font_descriptor = (CTFontDescriptorRef)CFArrayGetValueAtIndex(font_descriptors, i);
if(font_data && font_data->GetCTFont()) CTFontRef font = CTFontCreateWithFontDescriptor(font_descriptor, 0, NULL);
if(font)
{ {
m_aFontContainer [ font_data->GetCTFont() ] = font_data; ImplDevFontAttributes devfont_attr;
if(GetDevFontAttributes( font_descriptor, devfont_attr ) )
{
CoreTextPhysicalFontFace* font_face = new CoreTextPhysicalFontFace(devfont_attr, font);
if(font_face && font_face->GetCTFont())
{
m_aFontContainer [ font_face->GetCTFont() ] = font_face;
}
}
CFRelease(font);
} }
} }
CFRelease(font); CFRelease(font_descriptors);
} }
CFRelease(font_descriptors); CFRelease(font_collection);
} }
CFRelease(font_collection);
} }
SystemFontList::~SystemFontList() SystemFontList::~SystemFontList()
...@@ -250,6 +257,7 @@ CoreTextPhysicalFontFace::CoreTextPhysicalFontFace( const ImplDevFontAttributes& ...@@ -250,6 +257,7 @@ CoreTextPhysicalFontFace::CoreTextPhysicalFontFace( const ImplDevFontAttributes&
, m_bHasCJKSupport( false ) , m_bHasCJKSupport( false )
, m_bFontCapabilitiesRead( false ) , m_bFontCapabilitiesRead( false )
{ {
msgs_debug(font,"retain %p as %p",font, m_CTFontRef);
} }
CoreTextPhysicalFontFace::~CoreTextPhysicalFontFace() CoreTextPhysicalFontFace::~CoreTextPhysicalFontFace()
...@@ -258,10 +266,8 @@ CoreTextPhysicalFontFace::~CoreTextPhysicalFontFace() ...@@ -258,10 +266,8 @@ CoreTextPhysicalFontFace::~CoreTextPhysicalFontFace()
{ {
m_pCharMap->DeReference(); m_pCharMap->DeReference();
} }
if( m_CTFontRef ) msgs_debug(font,"release font %p", m_CTFontRef);
{ SafeCFRelease(m_CTFontRef);
CFRelease(m_CTFontRef);
}
} }
PhysicalFontFace* CoreTextPhysicalFontFace::Clone() const PhysicalFontFace* CoreTextPhysicalFontFace::Clone() const
...@@ -274,6 +280,7 @@ PhysicalFontFace* CoreTextPhysicalFontFace::Clone() const ...@@ -274,6 +280,7 @@ PhysicalFontFace* CoreTextPhysicalFontFace::Clone() const
if( m_CTFontRef ) if( m_CTFontRef )
{ {
pClone->m_CTFontRef = (CTFontRef)CFRetain(m_CTFontRef); pClone->m_CTFontRef = (CTFontRef)CFRetain(m_CTFontRef);
msgs_debug(font,"clone ref %p into %p", m_CTFontRef, pClone->m_CTFontRef);
} }
return pClone; return pClone;
} }
...@@ -391,9 +398,6 @@ bool CoreTextPhysicalFontFace::GetRawFontData( std::vector<unsigned char>& rBuff ...@@ -391,9 +398,6 @@ bool CoreTextPhysicalFontFace::GetRawFontData( std::vector<unsigned char>& rBuff
if(CFF_table) if(CFF_table)
{ {
*pJustCFF = CFDataGetLength(CFF_table) ? true : false; *pJustCFF = CFDataGetLength(CFF_table) ? true : false;
}
if(CFF_table)
{
CFRelease(CFF_table); CFRelease(CFF_table);
return true; return true;
} }
......
...@@ -98,8 +98,14 @@ void CoreTextLayout::DrawText( SalGraphics& rGraphics ) const ...@@ -98,8 +98,14 @@ void CoreTextLayout::DrawText( SalGraphics& rGraphics ) const
CTLineDraw(m_line, gr.mrContext); CTLineDraw(m_line, gr.mrContext);
#else #else
InitGIA(); InitGIA();
msgs_debug(layout,"at- pos (%ld, %ld)", pos.X(), pos.Y()); msgs_debug(layout,"at- pos (%ld, %ld) ctfont=%p", pos.X(), pos.Y(),
m_style->GetFont());
CGFontRef cg_font = CTFontCopyGraphicsFont(m_style->GetFont(), NULL); CGFontRef cg_font = CTFontCopyGraphicsFont(m_style->GetFont(), NULL);
if(!cg_font)
{
msgs_debug(layout, "Error cg_font is %s", "NULL");
return;
}
CGContextSetFont(gr.mrContext, cg_font); CGContextSetFont(gr.mrContext, cg_font);
CGContextSetFontSize(gr.mrContext, CTFontGetSize(m_style->GetFont())); CGContextSetFontSize(gr.mrContext, CTFontGetSize(m_style->GetFont()));
CGContextSetTextDrawingMode(gr.mrContext, kCGTextFill); CGContextSetTextDrawingMode(gr.mrContext, kCGTextFill);
...@@ -114,20 +120,10 @@ void CoreTextLayout::DrawText( SalGraphics& rGraphics ) const ...@@ -114,20 +120,10 @@ void CoreTextLayout::DrawText( SalGraphics& rGraphics ) const
CGContextSetRGBFillColor(gr.mrContext, 0.0, 0.0, 0.0, 1.0); CGContextSetRGBFillColor(gr.mrContext, 0.0, 0.0, 0.0, 1.0);
} }
CFRelease(cg_font); CFRelease(cg_font);
// CGContextSetTextPosition(gr.mrContext, pos.X(), pos.Y());
CGContextSetTextMatrix(gr.mrContext, CGAffineTransformMakeScale(1.0, -1.0)); CGContextSetTextMatrix(gr.mrContext, CGAffineTransformMakeScale(1.0, -1.0));
CGContextSetShouldAntialias( gr.mrContext, !gr.mbNonAntialiasedText ); CGContextSetShouldAntialias( gr.mrContext, !gr.mbNonAntialiasedText );
CGContextTranslateCTM(gr.mrContext, pos.X(), pos.Y()); CGContextTranslateCTM(gr.mrContext, pos.X(), pos.Y());
// for(int i = 0; i < m_glyphs_count ; ++i) CGContextShowGlyphs(gr.mrContext, m_glyphs, m_glyphs_count);
// {
// msgs_debug(layout,"m_glyph=%p m_glyph_positions=%p count=%d", m_glyphs, m_glyph_positions, m_glyphs_count);
// msgs_debug(layout,"glyph[%d]=0x%x position(%g,%g)", i, m_glyphs[i], m_glyph_positions[i].x, m_glyph_positions[i].y);
CGContextShowGlyphs(gr.mrContext, m_glyphs, m_glyphs_count);
// CGContextShowGlyphsAtPositions(gr.mrContext, m_glyphs, m_glyph_positions, m_glyphs_count);
// CGContextShowGlyphsWidthAdvances(gr.mrContext, m_glyphs, m_glyph_advances, m_glyphs_count);
// CGContextShowGlyphsAtPoint(gr.mrContext, pos.X(), pos.Y(), m_glyphs, m_glyphs_count);
// }
#endif #endif
// restore the original graphic context transformations // restore the original graphic context transformations
CGContextRestoreGState( gr.mrContext ); CGContextRestoreGState( gr.mrContext );
...@@ -362,6 +358,8 @@ bool CoreTextLayout::InitGIA() const ...@@ -362,6 +358,8 @@ bool CoreTextLayout::InitGIA() const
for (CFIndex j = 0 ; j < nb_glyphs; ++p, ++j ) for (CFIndex j = 0 ; j < nb_glyphs; ++p, ++j )
{ {
m_glyphs[ p ] = glyphs[ j ]; m_glyphs[ p ] = glyphs[ j ];
msgs_debug(layout,"m_glyphys[%d]=glyphs[%d] run %d : 0x%x\n",
p,(int)j, (int)i, glyphs[j]);
CFIndex k = indices[ j ]; CFIndex k = indices[ j ];
m_glyphs2chars[p] = k; m_glyphs2chars[p] = k;
m_chars2glyphs[k] = p; m_chars2glyphs[k] = p;
...@@ -385,7 +383,8 @@ bool CoreTextLayout::InitGIA() const ...@@ -385,7 +383,8 @@ bool CoreTextLayout::InitGIA() const
bool CoreTextLayout::LayoutText(ImplLayoutArgs& args) bool CoreTextLayout::LayoutText(ImplLayoutArgs& args)
{ {
msgs_debug(layout,"-->"); msgs_debug(layout,"-->(m_style=%p font=%p",
m_style, m_style->GetFont());
Clean(); Clean();
m_style->SetColor(); m_style->SetColor();
/* retreive MinCharPos EndCharPos Flags and Orientation */ /* retreive MinCharPos EndCharPos Flags and Orientation */
......
...@@ -35,13 +35,14 @@ long CoreTextStyleInfo::GetFontStretchedSize() const ...@@ -35,13 +35,14 @@ long CoreTextStyleInfo::GetFontStretchedSize() const
void CoreTextStyleInfo::SetFont(FontSelectPattern* requested_font) void CoreTextStyleInfo::SetFont(FontSelectPattern* requested_font)
{ {
msgs_debug(style,"req(%p) release font %p -->", requested_font, m_CTFont); msgs_debug(style,"req(%p) release font %p -->", requested_font, m_CTFont);
SafeCFRelease(m_CTFont);
if(!requested_font) if(!requested_font)
{ {
SafeCFRelease(m_CTFont);
m_font_face = NULL; m_font_face = NULL;
return; return;
} }
m_font_face = static_cast<const CoreTextPhysicalFontFace*>(requested_font->mpFontData); m_font_face = (CoreTextPhysicalFontFace*)(requested_font->mpFontData);
m_matrix = CGAffineTransformIdentity; m_matrix = CGAffineTransformIdentity;
CGFloat font_size = (CGFloat)requested_font->mfExactHeight; CGFloat font_size = (CGFloat)requested_font->mfExactHeight;
...@@ -69,6 +70,8 @@ void CoreTextStyleInfo::SetFont(FontSelectPattern* requested_font) ...@@ -69,6 +70,8 @@ void CoreTextStyleInfo::SetFont(FontSelectPattern* requested_font)
m_matrix = CGAffineTransformScale(m_matrix, m_stretch_factor, 1.0F ); m_matrix = CGAffineTransformScale(m_matrix, m_stretch_factor, 1.0F );
} }
SafeCFRelease(m_CTFont);
/* FIXME: pass attribute to take into accout 'VerticalStyle' */ /* FIXME: pass attribute to take into accout 'VerticalStyle' */
/* FIXME: how to deal with 'rendering options' i.e anti-aliasing, does it even matter in CoreText ? */ /* FIXME: how to deal with 'rendering options' i.e anti-aliasing, does it even matter in CoreText ? */
m_CTFont = CTFontCreateCopyWithAttributes(m_font_face->GetCTFont(), font_size, &m_matrix, NULL); m_CTFont = CTFontCreateCopyWithAttributes(m_font_face->GetCTFont(), font_size, &m_matrix, NULL);
......
...@@ -23,7 +23,6 @@ AquaSalGraphics::AquaSalGraphics() ...@@ -23,7 +23,6 @@ AquaSalGraphics::AquaSalGraphics()
, mxClipPath( NULL ) , mxClipPath( NULL )
, maLineColor( COL_WHITE ) , maLineColor( COL_WHITE )
, maFillColor( COL_BLACK ) , maFillColor( COL_BLACK )
, m_font_face( NULL )
, mbNonAntialiasedText( false ) , mbNonAntialiasedText( false )
, mbPrinter( false ) , mbPrinter( false )
, mbVirDev( false ) , mbVirDev( false )
...@@ -152,20 +151,30 @@ sal_uLong AquaSalGraphics::GetKernPairs( sal_uLong, ImplKernPairData* ) ...@@ -152,20 +151,30 @@ sal_uLong AquaSalGraphics::GetKernPairs( sal_uLong, ImplKernPairData* )
bool AquaSalGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const bool AquaSalGraphics::GetImplFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const
{ {
if( !m_font_face ) if( !m_style )
{ {
return false; return false;
} }
return m_font_face->GetImplFontCapabilities(rFontCapabilities); CoreTextPhysicalFontFace* font_face = m_style->GetFontFace();
if( !font_face)
{
return false;
}
return font_face->GetImplFontCapabilities(rFontCapabilities);
} }
const ImplFontCharMap* AquaSalGraphics::GetImplFontCharMap() const const ImplFontCharMap* AquaSalGraphics::GetImplFontCharMap() const
{ {
if( !m_font_face ) if( !m_style )
{
return false;
}
CoreTextPhysicalFontFace* font_face = m_style->GetFontFace();
if( !font_face)
{ {
return ImplFontCharMap::GetDefaultMap(); return ImplFontCharMap::GetDefaultMap();
} }
return m_font_face->GetImplFontCharMap(); return font_face->GetImplFontCharMap();
} }
bool AquaSalGraphics::GetRawFontData( const PhysicalFontFace* pFontFace, bool AquaSalGraphics::GetRawFontData( const PhysicalFontFace* pFontFace,
......
...@@ -14,6 +14,7 @@ public: ...@@ -14,6 +14,7 @@ public:
CoreTextStyleInfo(); CoreTextStyleInfo();
~CoreTextStyleInfo(); ~CoreTextStyleInfo();
CTFontRef GetFont() const { return m_CTFont; }; CTFontRef GetFont() const { return m_CTFont; };
CoreTextPhysicalFontFace* GetFontFace() const { return m_font_face; };
long GetFontStretchedSize() const; long GetFontStretchedSize() const;
float GetFontStretchFactor() const { return m_stretch_factor; }; float GetFontStretchFactor() const { return m_stretch_factor; };
CTParagraphStyleRef GetParagraphStyle() const { return m_CTParagraphStyle; } ; CTParagraphStyleRef GetParagraphStyle() const { return m_CTParagraphStyle; } ;
...@@ -33,7 +34,7 @@ private: ...@@ -33,7 +34,7 @@ private:
CTParagraphStyleRef m_CTParagraphStyle; CTParagraphStyleRef m_CTParagraphStyle;
CTFontRef m_CTFont; CTFontRef m_CTFont;
CGColorRef m_color; CGColorRef m_color;
const CoreTextPhysicalFontFace* m_font_face; CoreTextPhysicalFontFace* m_font_face;
}; };
......
...@@ -48,8 +48,6 @@ protected: ...@@ -48,8 +48,6 @@ protected:
RGBAColor maLineColor; //< pen color RGBA RGBAColor maLineColor; //< pen color RGBA
RGBAColor maFillColor; //< brush color RGBA RGBAColor maFillColor; //< brush color RGBA
CoreTextPhysicalFontFace* m_font_face; //< Device Font settings
bool mbNonAntialiasedText; //< allows text to be rendered without antialiasing bool mbNonAntialiasedText; //< allows text to be rendered without antialiasing
// Graphics types // Graphics types
...@@ -60,8 +58,6 @@ protected: ...@@ -60,8 +58,6 @@ protected:
RGBColor m_TextColor; RGBColor m_TextColor;
CoreTextStyleInfo* m_style;
public: public:
AquaSalGraphics(); AquaSalGraphics();
virtual ~AquaSalGraphics(); virtual ~AquaSalGraphics();
...@@ -271,6 +267,8 @@ public: ...@@ -271,6 +267,8 @@ public:
virtual SystemFontData GetSysFontData( int /* nFallbacklevel */ ) const; virtual SystemFontData GetSysFontData( int /* nFallbacklevel */ ) const;
private: private:
CoreTextStyleInfo* m_style;
// differences between VCL, Quartz and kHiThemeOrientation coordinate systems // differences between VCL, Quartz and kHiThemeOrientation coordinate systems
// make some graphics seem to be vertically-mirrored from a VCL perspective // make some graphics seem to be vertically-mirrored from a VCL perspective
bool IsFlipped() const { return mbWindow; }; bool IsFlipped() const { return mbWindow; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment