OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. |
6 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. | 6 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 cacheEntry->width = result; | 254 cacheEntry->width = result; |
255 } | 255 } |
256 | 256 |
257 if (glyphOverflow) | 257 if (glyphOverflow) |
258 updateGlyphOverflowFromBounds(glyphBounds, fontMetrics(), glyphOverflow)
; | 258 updateGlyphOverflowFromBounds(glyphBounds, fontMetrics(), glyphOverflow)
; |
259 return result; | 259 return result; |
260 } | 260 } |
261 | 261 |
262 float Font::width(const TextRun& run, int& charsConsumed, Glyph& glyphId) const | 262 float Font::width(const TextRun& run, int& charsConsumed, Glyph& glyphId) const |
263 { | 263 { |
264 #if ENABLE(SVG_FONTS) | |
265 if (TextRun::RenderingContext* renderingContext = run.renderingContext()) | |
266 return renderingContext->floatWidthUsingSVGFont(*this, run, charsConsume
d, glyphId); | |
267 #endif | |
268 | |
269 charsConsumed = run.length(); | 264 charsConsumed = run.length(); |
270 glyphId = 0; | 265 glyphId = 0; |
271 return width(run); | 266 return width(run); |
272 } | 267 } |
273 | 268 |
274 namespace { | 269 namespace { |
275 | 270 |
276 template <bool hasOffsets> | 271 template <bool hasOffsets> |
277 bool buildTextBlobInternal(const GlyphBuffer& glyphBuffer, SkScalar initialAdvan
ce, | 272 bool buildTextBlobInternal(const GlyphBuffer& glyphBuffer, SkScalar initialAdvan
ce, |
278 const SkRect* bounds, bool couldUseLCD, SkTextBlobBuilder& builder) | 273 const SkRect* bounds, bool couldUseLCD, SkTextBlobBuilder& builder) |
279 { | 274 { |
280 SkScalar x = initialAdvance; | 275 SkScalar x = initialAdvance; |
281 unsigned i = 0; | 276 unsigned i = 0; |
282 while (i < glyphBuffer.size()) { | 277 while (i < glyphBuffer.size()) { |
283 const SimpleFontData* fontData = glyphBuffer.fontDataAt(i); | 278 const SimpleFontData* fontData = glyphBuffer.fontDataAt(i); |
284 | 279 |
285 // FIXME: Handle vertical text. | 280 // FIXME: Handle vertical text. |
286 if (fontData->platformData().orientation() == Vertical) | 281 if (fontData->platformData().orientation() == Vertical) |
287 return false; | 282 return false; |
288 | 283 |
289 // FIXME: Handle SVG fonts. | |
290 if (fontData->isSVGFont()) | |
291 return false; | |
292 | |
293 // FIXME: FontPlatformData makes some decisions on the device scale | 284 // FIXME: FontPlatformData makes some decisions on the device scale |
294 // factor, which is found via the GraphicsContext. This should be fixed | 285 // factor, which is found via the GraphicsContext. This should be fixed |
295 // to avoid correctness problems here. | 286 // to avoid correctness problems here. |
296 SkPaint paint; | 287 SkPaint paint; |
297 fontData->platformData().setupPaint(&paint); | 288 fontData->platformData().setupPaint(&paint); |
298 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 289 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
299 | 290 |
300 // FIXME: this should go away after the big LCD cleanup. | 291 // FIXME: this should go away after the big LCD cleanup. |
301 paint.setLCDRenderText(paint.isLCDRenderText() && couldUseLCD); | 292 paint.setLCDRenderText(paint.isLCDRenderText() && couldUseLCD); |
302 | 293 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 return offsetForPositionForComplexText(run, x, includePartialGlyphs); | 365 return offsetForPositionForComplexText(run, x, includePartialGlyphs); |
375 } | 366 } |
376 | 367 |
377 CodePath Font::codePath(const TextRunPaintInfo& runInfo) const | 368 CodePath Font::codePath(const TextRunPaintInfo& runInfo) const |
378 { | 369 { |
379 const TextRun& run = runInfo.run; | 370 const TextRun& run = runInfo.run; |
380 | 371 |
381 if (fontDescription().typesettingFeatures() && (runInfo.from || runInfo.to !
= run.length())) | 372 if (fontDescription().typesettingFeatures() && (runInfo.from || runInfo.to !
= run.length())) |
382 return ComplexPath; | 373 return ComplexPath; |
383 | 374 |
384 #if ENABLE(SVG_FONTS) | |
385 if (run.renderingContext()) | |
386 return SimplePath; | |
387 #endif | |
388 | |
389 if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings
()->size() > 0 && m_fontDescription.letterSpacing() == 0) | 375 if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings
()->size() > 0 && m_fontDescription.letterSpacing() == 0) |
390 return ComplexPath; | 376 return ComplexPath; |
391 | 377 |
392 if (m_fontDescription.widthVariant() != RegularWidth) | 378 if (m_fontDescription.widthVariant() != RegularWidth) |
393 return ComplexPath; | 379 return ComplexPath; |
394 | 380 |
395 if (run.length() > 1 && fontDescription().typesettingFeatures()) | 381 if (run.length() > 1 && fontDescription().typesettingFeatures()) |
396 return ComplexPath; | 382 return ComplexPath; |
397 | 383 |
398 // FIXME: This really shouldn't be needed but for some reason the | 384 // FIXME: This really shouldn't be needed but for some reason the |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 } | 523 } |
538 } | 524 } |
539 return std::make_pair(data, page); | 525 return std::make_pair(data, page); |
540 } | 526 } |
541 | 527 |
542 std::pair<GlyphData, GlyphPage*> Font::glyphDataAndPageForCharacter(UChar32& c,
bool mirror, bool normalizeSpace, FontDataVariant variant) const | 528 std::pair<GlyphData, GlyphPage*> Font::glyphDataAndPageForCharacter(UChar32& c,
bool mirror, bool normalizeSpace, FontDataVariant variant) const |
543 { | 529 { |
544 ASSERT(isMainThread()); | 530 ASSERT(isMainThread()); |
545 | 531 |
546 if (variant == AutoVariant) { | 532 if (variant == AutoVariant) { |
547 if (m_fontDescription.variant() == FontVariantSmallCaps && !primaryFont(
)->isSVGFont()) { | 533 if (m_fontDescription.variant() == FontVariantSmallCaps) { |
548 UChar32 upperC = toUpper(c); | 534 UChar32 upperC = toUpper(c); |
549 if (upperC != c) { | 535 if (upperC != c) { |
550 c = upperC; | 536 c = upperC; |
551 variant = SmallCapsVariant; | 537 variant = SmallCapsVariant; |
552 } else { | 538 } else { |
553 variant = NormalVariant; | 539 variant = NormalVariant; |
554 } | 540 } |
555 } else { | 541 } else { |
556 variant = NormalVariant; | 542 variant = NormalVariant; |
557 } | 543 } |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 float Font::drawGlyphBuffer(GraphicsContext* context, | 953 float Font::drawGlyphBuffer(GraphicsContext* context, |
968 const TextRunPaintInfo& runInfo, const GlyphBuffer& glyphBuffer, | 954 const TextRunPaintInfo& runInfo, const GlyphBuffer& glyphBuffer, |
969 const FloatPoint& point) const | 955 const FloatPoint& point) const |
970 { | 956 { |
971 // Draw each contiguous run of glyphs that use the same font data. | 957 // Draw each contiguous run of glyphs that use the same font data. |
972 const SimpleFontData* fontData = glyphBuffer.fontDataAt(0); | 958 const SimpleFontData* fontData = glyphBuffer.fontDataAt(0); |
973 FloatPoint startPoint(point); | 959 FloatPoint startPoint(point); |
974 float advanceSoFar = 0; | 960 float advanceSoFar = 0; |
975 unsigned lastFrom = 0; | 961 unsigned lastFrom = 0; |
976 unsigned nextGlyph = 0; | 962 unsigned nextGlyph = 0; |
977 #if ENABLE(SVG_FONTS) | |
978 TextRun::RenderingContext* renderingContext = runInfo.run.renderingContext()
; | |
979 #endif | |
980 | 963 |
981 while (nextGlyph < glyphBuffer.size()) { | 964 while (nextGlyph < glyphBuffer.size()) { |
982 const SimpleFontData* nextFontData = glyphBuffer.fontDataAt(nextGlyph); | 965 const SimpleFontData* nextFontData = glyphBuffer.fontDataAt(nextGlyph); |
983 | 966 |
984 if (nextFontData != fontData) { | 967 if (nextFontData != fontData) { |
985 #if ENABLE(SVG_FONTS) | 968 drawGlyphs(context, fontData, glyphBuffer, lastFrom, nextGlyph - las
tFrom, startPoint, runInfo.bounds); |
986 if (renderingContext && fontData->isSVGFont()) | |
987 renderingContext->drawSVGGlyphs(context, runInfo.run, fontData,
glyphBuffer, lastFrom, nextGlyph - lastFrom, startPoint); | |
988 else | |
989 #endif | |
990 drawGlyphs(context, fontData, glyphBuffer, lastFrom, nextGlyph -
lastFrom, startPoint, runInfo.bounds); | |
991 | 969 |
992 lastFrom = nextGlyph; | 970 lastFrom = nextGlyph; |
993 fontData = nextFontData; | 971 fontData = nextFontData; |
994 startPoint += FloatSize(advanceSoFar, 0); | 972 startPoint += FloatSize(advanceSoFar, 0); |
995 advanceSoFar = 0; | 973 advanceSoFar = 0; |
996 } | 974 } |
997 advanceSoFar += glyphBuffer.advanceAt(nextGlyph); | 975 advanceSoFar += glyphBuffer.advanceAt(nextGlyph); |
998 nextGlyph++; | 976 nextGlyph++; |
999 } | 977 } |
1000 | 978 |
1001 #if ENABLE(SVG_FONTS) | 979 drawGlyphs(context, fontData, glyphBuffer, lastFrom, nextGlyph - lastFrom, s
tartPoint, runInfo.bounds); |
1002 if (renderingContext && fontData->isSVGFont()) | |
1003 renderingContext->drawSVGGlyphs(context, runInfo.run, fontData, glyphBuf
fer, lastFrom, nextGlyph - lastFrom, startPoint); | |
1004 else | |
1005 #endif | |
1006 drawGlyphs(context, fontData, glyphBuffer, lastFrom, nextGlyph - lastFro
m, startPoint, runInfo.bounds); | |
1007 | |
1008 startPoint += FloatSize(advanceSoFar, 0); | 980 startPoint += FloatSize(advanceSoFar, 0); |
1009 return startPoint.x() - point.x(); | 981 return startPoint.x() - point.x(); |
1010 } | 982 } |
1011 | 983 |
1012 inline static float offsetToMiddleOfGlyph(const SimpleFontData* fontData, Glyph
glyph) | 984 inline static float offsetToMiddleOfGlyph(const SimpleFontData* fontData, Glyph
glyph) |
1013 { | 985 { |
1014 if (fontData->platformData().orientation() == Horizontal) { | 986 if (fontData->platformData().orientation() == Horizontal) { |
1015 FloatRect bounds = fontData->boundsForGlyph(glyph); | 987 FloatRect bounds = fontData->boundsForGlyph(glyph); |
1016 return bounds.x() + bounds.width() / 2; | 988 return bounds.x() + bounds.width() / 2; |
1017 } | 989 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1131 if (delta <= 0) | 1103 if (delta <= 0) |
1132 break; | 1104 break; |
1133 } | 1105 } |
1134 } | 1106 } |
1135 } | 1107 } |
1136 | 1108 |
1137 return offset; | 1109 return offset; |
1138 } | 1110 } |
1139 | 1111 |
1140 } // namespace blink | 1112 } // namespace blink |
OLD | NEW |