1 /* 2 * Copyright (C) 2007 Kevin Watters, Kevin Ollivier. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "FloatSize.h" 28 #include "GlyphBuffer.h" 29 #include "GraphicsContext.h" 30 #include "SimpleFontData.h" 31 #include <wtf/Vector.h> 32 33 #include <ApplicationServices/ApplicationServices.h> 34 35 #include <dlfcn.h> 36 37 #include <wx/defs.h> 38 #include <wx/dcclient.h> 39 #include <wx/dcgraph.h> 40 #include <wx/gdicmn.h> 41 42 43 // Unfortunately we need access to a private function to get the character -> glyph conversion needed to 44 // allow us to use CGContextShowGlyphsWithAdvances 45 // Note that on < 10.5, the function is called CGFontGetGlyphsForUnicodes, so we need to detect and deal 46 // with this. 47 typedef void (*CGFontGetGlyphsForUnicharsPtr)(CGFontRef, const UniChar[], const CGGlyph[], size_t); 48 static CGFontGetGlyphsForUnicharsPtr CGFontGetGlyphsForUnichars = (CGFontGetGlyphsForUnicharsPtr)dlsym(RTLD_DEFAULT, "CGFontGetGlyphsForUnichars"); 49 50 namespace WebCore { 51 52 void drawTextWithSpacing(GraphicsContext* graphicsContext, const SimpleFontData* font, const wxColour& color, const GlyphBuffer& glyphBuffer, int from, int numGlyphs, const FloatPoint& point) 53 { 54 graphicsContext->save(); 55 56 wxGCDC* dc = static_cast<wxGCDC*>(graphicsContext->platformContext()); 57 58 wxFont* wxfont = font->getWxFont(); 59 graphicsContext->setFillColor(graphicsContext->fillColor(), DeviceColorSpace); 60 61 CGContextRef cgContext = static_cast<CGContextRef>(dc->GetGraphicsContext()->GetNativeContext()); 62 63 CGFontRef cgFont; 64 65 #ifdef wxOSX_USE_CORE_TEXT && wxOSX_USE_CORE_TEXT 66 cgFont = CTFontCopyGraphicsFont((CTFontRef)wxfont->OSXGetCTFont(), NULL); 67 #else 68 ATSFontRef fontRef; 69 70 fontRef = FMGetATSFontRefFromFont(wxfont->MacGetATSUFontID()); 71 72 if (fontRef) 73 cgFont = CGFontCreateWithPlatformFont((void*)&fontRef); 74 #endif 75 76 CGContextSetFont(cgContext, cgFont); 77 78 CGContextSetFontSize(cgContext, wxfont->GetPointSize()); 79 80 CGFloat red, green, blue, alpha; 81 graphicsContext->fillColor().getRGBA(red, green, blue, alpha); 82 CGContextSetRGBFillColor(cgContext, red, green, blue, alpha); 83 84 CGAffineTransform matrix = CGAffineTransformIdentity; 85 matrix.b = -matrix.b; 86 matrix.d = -matrix.d; 87 88 CGContextSetTextMatrix(cgContext, matrix); 89 90 CGContextSetTextPosition(cgContext, point.x(), point.y()); 91 92 const FloatSize* advanceSizes = static_cast<const FloatSize*>(glyphBuffer.advances(from)); 93 int size = glyphBuffer.size() - from; 94 CGSize sizes[size]; 95 CGGlyph glyphs[numGlyphs]; 96 97 // if the function doesn't exist, we're probably on tiger and need to grab the 98 // function under its old name, CGFontGetGlyphsForUnicodes 99 if (!CGFontGetGlyphsForUnichars) 100 CGFontGetGlyphsForUnichars = (CGFontGetGlyphsForUnicharsPtr)dlsym(RTLD_DEFAULT, "CGFontGetGlyphsForUnicodes"); 101 102 // Let's make sure we got the function under one name or another! 103 ASSERT(CGFontGetGlyphsForUnichars); 104 CGFontGetGlyphsForUnichars(cgFont, glyphBuffer.glyphs(from), glyphs, numGlyphs); 105 106 for (int i = 0; i < size; i++) { 107 FloatSize fsize = advanceSizes[i]; 108 sizes[i] = CGSizeMake(fsize.width(), fsize.height()); 109 } 110 111 CGContextShowGlyphsWithAdvances(cgContext, glyphs, sizes, numGlyphs); 112 113 if (cgFont) 114 CGFontRelease(cgFont); 115 graphicsContext->restore(); 116 } 117 118 } 119