| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. | 2 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 if ((textMode & TextModeStroke) && gc->hasStroke()) { | 216 if ((textMode & TextModeStroke) && gc->hasStroke()) { |
| 217 SkPaint paint = gc->strokePaint(); | 217 SkPaint paint = gc->strokePaint(); |
| 218 gc->adjustTextRenderMode(&paint); | 218 gc->adjustTextRenderMode(&paint); |
| 219 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 219 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
| 220 if (textMode & TextModeFill) | 220 if (textMode & TextModeFill) |
| 221 paint.setLooper(0); | 221 paint.setLooper(0); |
| 222 gc->drawTextBlob(blob, origin, paint); | 222 gc->drawTextBlob(blob, origin, paint); |
| 223 } | 223 } |
| 224 } | 224 } |
| 225 | 225 |
| 226 void Font::drawComplexText(GraphicsContext* gc, const TextRunPaintInfo& runInfo,
const FloatPoint& point) const | 226 float Font::drawComplexText(GraphicsContext* gc, const TextRunPaintInfo& runInfo
, const FloatPoint& point) const |
| 227 { | 227 { |
| 228 if (!runInfo.run.length()) | 228 if (!runInfo.run.length()) |
| 229 return; | 229 return 0; |
| 230 | 230 |
| 231 TextDrawingModeFlags textMode = gc->textDrawingMode(); | 231 TextDrawingModeFlags textMode = gc->textDrawingMode(); |
| 232 bool fill = textMode & TextModeFill; | 232 bool fill = textMode & TextModeFill; |
| 233 bool stroke = (textMode & TextModeStroke) && gc->hasStroke(); | 233 bool stroke = (textMode & TextModeStroke) && gc->hasStroke(); |
| 234 | 234 |
| 235 if (!fill && !stroke) | 235 if (!fill && !stroke) |
| 236 return; | 236 return 0; |
| 237 | 237 |
| 238 GlyphBuffer glyphBuffer; | 238 GlyphBuffer glyphBuffer; |
| 239 HarfBuzzShaper shaper(this, runInfo.run); | 239 HarfBuzzShaper shaper(this, runInfo.run); |
| 240 shaper.setDrawRange(runInfo.from, runInfo.to); | 240 shaper.setDrawRange(runInfo.from, runInfo.to); |
| 241 if (!shaper.shape(&glyphBuffer) || glyphBuffer.isEmpty()) | 241 if (!shaper.shape(&glyphBuffer) || glyphBuffer.isEmpty()) |
| 242 return; | 242 return 0; |
| 243 FloatPoint adjustedPoint = shaper.adjustStartPoint(point); | 243 FloatPoint adjustedPoint = shaper.adjustStartPoint(point); |
| 244 drawGlyphBuffer(gc, runInfo, glyphBuffer, adjustedPoint); | 244 return drawGlyphBuffer(gc, runInfo, glyphBuffer, adjustedPoint); |
| 245 } | 245 } |
| 246 | 246 |
| 247 void Font::drawEmphasisMarksForComplexText(GraphicsContext* context, const TextR
unPaintInfo& runInfo, const AtomicString& mark, const FloatPoint& point) const | 247 void Font::drawEmphasisMarksForComplexText(GraphicsContext* context, const TextR
unPaintInfo& runInfo, const AtomicString& mark, const FloatPoint& point) const |
| 248 { | 248 { |
| 249 GlyphBuffer glyphBuffer; | 249 GlyphBuffer glyphBuffer; |
| 250 | 250 |
| 251 float initialAdvance = getGlyphsAndAdvancesForComplexText(runInfo, glyphBuff
er, ForTextEmphasis); | 251 float initialAdvance = getGlyphsAndAdvancesForComplexText(runInfo, glyphBuff
er, ForTextEmphasis); |
| 252 | 252 |
| 253 if (glyphBuffer.isEmpty()) | 253 if (glyphBuffer.isEmpty()) |
| 254 return; | 254 return; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 FloatRect Font::selectionRectForComplexText(const TextRun& run, | 292 FloatRect Font::selectionRectForComplexText(const TextRun& run, |
| 293 const FloatPoint& point, int height, | 293 const FloatPoint& point, int height, |
| 294 int from, int to) const | 294 int from, int to) const |
| 295 { | 295 { |
| 296 HarfBuzzShaper shaper(this, run); | 296 HarfBuzzShaper shaper(this, run); |
| 297 if (!shaper.shape()) | 297 if (!shaper.shape()) |
| 298 return FloatRect(); | 298 return FloatRect(); |
| 299 return shaper.selectionRect(point, height, from, to); | 299 return shaper.selectionRect(point, height, from, to); |
| 300 } | 300 } |
| 301 | 301 |
| 302 PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initia
lAdvance, const FloatRect& bounds) const | 302 PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initia
lAdvance, const FloatRect& bounds, float& advance) const |
| 303 { | 303 { |
| 304 // FIXME: Except for setupPaint, this is not specific to FontHarfBuzz. | 304 // FIXME: Except for setupPaint, this is not specific to FontHarfBuzz. |
| 305 // FIXME: Also implement the more general full-positioning path. | 305 // FIXME: Also implement the more general full-positioning path. |
| 306 ASSERT(!glyphBuffer.hasVerticalAdvances()); | 306 ASSERT(!glyphBuffer.hasVerticalAdvances()); |
| 307 | 307 |
| 308 SkTextBlobBuilder builder; | 308 SkTextBlobBuilder builder; |
| 309 SkScalar x = SkFloatToScalar(initialAdvance); | 309 SkScalar x = SkFloatToScalar(initialAdvance); |
| 310 SkRect skBounds = bounds; | 310 SkRect skBounds = bounds; |
| 311 | 311 |
| 312 unsigned i = 0; | 312 unsigned i = 0; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 338 const uint16_t* glyphs = glyphBuffer.glyphs(start); | 338 const uint16_t* glyphs = glyphBuffer.glyphs(start); |
| 339 std::copy(glyphs, glyphs + count, buffer.glyphs); | 339 std::copy(glyphs, glyphs + count, buffer.glyphs); |
| 340 | 340 |
| 341 const FloatSize* advances = glyphBuffer.advances(start); | 341 const FloatSize* advances = glyphBuffer.advances(start); |
| 342 for (unsigned j = 0; j < count; j++) { | 342 for (unsigned j = 0; j < count; j++) { |
| 343 buffer.pos[j] = x; | 343 buffer.pos[j] = x; |
| 344 x += SkFloatToScalar(advances[j].width()); | 344 x += SkFloatToScalar(advances[j].width()); |
| 345 } | 345 } |
| 346 } | 346 } |
| 347 | 347 |
| 348 advance = x; |
| 348 return adoptRef(builder.build()); | 349 return adoptRef(builder.build()); |
| 349 } | 350 } |
| 350 | 351 |
| 351 } // namespace blink | 352 } // namespace blink |
| OLD | NEW |