Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: Source/platform/fonts/harfbuzz/FontHarfBuzz.cpp

Issue 551183005: [TextBlob] Fix LCD text handling. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/fonts/Font.cpp ('k') | Source/platform/graphics/GraphicsContext.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 paintGlyphs(gc, font, glyphs, numGlyphs, pos, textRect); 199 paintGlyphs(gc, font, glyphs, numGlyphs, pos, textRect);
200 } 200 }
201 201
202 void Font::drawTextBlob(GraphicsContext* gc, const SkTextBlob* blob, const SkPoi nt& origin) const 202 void Font::drawTextBlob(GraphicsContext* gc, const SkTextBlob* blob, const SkPoi nt& origin) const
203 { 203 {
204 // FIXME: It would be good to move this to Font.cpp, if we're sure that none 204 // FIXME: It would be good to move this to Font.cpp, if we're sure that none
205 // of the things in FontMac's setupPaint need to apply here. 205 // of the things in FontMac's setupPaint need to apply here.
206 // See also paintGlyphs. 206 // See also paintGlyphs.
207 TextDrawingModeFlags textMode = gc->textDrawingMode(); 207 TextDrawingModeFlags textMode = gc->textDrawingMode();
208 208
209 if (textMode & TextModeFill) { 209 if (textMode & TextModeFill)
210 SkPaint paint = gc->fillPaint(); 210 gc->drawTextBlob(blob, origin, gc->fillPaint());
211 gc->adjustTextRenderMode(&paint);
212 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
213 gc->drawTextBlob(blob, origin, paint);
214 }
215 211
216 if ((textMode & TextModeStroke) && gc->hasStroke()) { 212 if ((textMode & TextModeStroke) && gc->hasStroke()) {
217 SkPaint paint = gc->strokePaint(); 213 SkPaint paint = gc->strokePaint();
218 gc->adjustTextRenderMode(&paint);
219 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
220 if (textMode & TextModeFill) 214 if (textMode & TextModeFill)
221 paint.setLooper(0); 215 paint.setLooper(0);
222 gc->drawTextBlob(blob, origin, paint); 216 gc->drawTextBlob(blob, origin, paint);
223 } 217 }
224 } 218 }
225 219
226 float Font::drawComplexText(GraphicsContext* gc, const TextRunPaintInfo& runInfo , const FloatPoint& point) const 220 float Font::drawComplexText(GraphicsContext* gc, const TextRunPaintInfo& runInfo , const FloatPoint& point) const
227 { 221 {
228 if (!runInfo.run.length()) 222 if (!runInfo.run.length())
229 return 0; 223 return 0;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 FloatRect Font::selectionRectForComplexText(const TextRun& run, 286 FloatRect Font::selectionRectForComplexText(const TextRun& run,
293 const FloatPoint& point, int height, 287 const FloatPoint& point, int height,
294 int from, int to) const 288 int from, int to) const
295 { 289 {
296 HarfBuzzShaper shaper(this, run); 290 HarfBuzzShaper shaper(this, run);
297 if (!shaper.shape()) 291 if (!shaper.shape())
298 return FloatRect(); 292 return FloatRect();
299 return shaper.selectionRect(point, height, from, to); 293 return shaper.selectionRect(point, height, from, to);
300 } 294 }
301 295
302 PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initia lAdvance, const FloatRect& bounds, float& advance) const 296 PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, const Graphi csContext& context,
297 float initialAdvance, const FloatRect& bounds, float& advance) const
303 { 298 {
304 // FIXME: Except for setupPaint, this is not specific to FontHarfBuzz. 299 // FIXME: Except for setupPaint, this is not specific to FontHarfBuzz.
305 // FIXME: Also implement the more general full-positioning path. 300 // FIXME: Also implement the more general full-positioning path.
306 ASSERT(!glyphBuffer.hasVerticalAdvances()); 301 ASSERT(!glyphBuffer.hasVerticalAdvances());
307 302
308 SkTextBlobBuilder builder; 303 SkTextBlobBuilder builder;
309 SkScalar x = SkFloatToScalar(initialAdvance); 304 SkScalar x = SkFloatToScalar(initialAdvance);
310 SkRect skBounds = bounds; 305 SkRect skBounds = bounds;
311 306
312 unsigned i = 0; 307 unsigned i = 0;
313 while (i < glyphBuffer.size()) { 308 while (i < glyphBuffer.size()) {
314 const SimpleFontData* fontData = glyphBuffer.fontDataAt(i); 309 const SimpleFontData* fontData = glyphBuffer.fontDataAt(i);
315 310
316 // FIXME: Handle vertical text. 311 // FIXME: Handle vertical text.
317 if (fontData->platformData().orientation() == Vertical) 312 if (fontData->platformData().orientation() == Vertical)
318 return nullptr; 313 return nullptr;
319 314
320 // FIXME: Handle SVG fonts. 315 // FIXME: Handle SVG fonts.
321 if (fontData->isSVGFont()) 316 if (fontData->isSVGFont())
322 return nullptr; 317 return nullptr;
323 318
324 // FIXME: FontPlatformData makes some decisions on the device scale 319 // FIXME: FontPlatformData makes some decisions on the device scale
325 // factor, which is found via the GraphicsContext. This should be fixed 320 // factor, which is found via the GraphicsContext. This should be fixed
326 // to avoid correctness problems here. 321 // to avoid correctness problems here.
327 SkPaint paint; 322 SkPaint paint;
328 fontData->platformData().setupPaint(&paint); 323 fontData->platformData().setupPaint(&paint);
324 context.adjustTextRenderMode(&paint);
jbroman 2014/09/10 17:09:40 When can these properties of the GraphicsContext c
329 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 325 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
330 326
331 unsigned start = i++; 327 unsigned start = i++;
332 while (i < glyphBuffer.size() && glyphBuffer.fontDataAt(i) == fontData) 328 while (i < glyphBuffer.size() && glyphBuffer.fontDataAt(i) == fontData)
333 i++; 329 i++;
334 unsigned count = i - start; 330 unsigned count = i - start;
335 331
336 const SkTextBlobBuilder::RunBuffer& buffer = builder.allocRunPosH(paint, count, 0, &skBounds); 332 const SkTextBlobBuilder::RunBuffer& buffer = builder.allocRunPosH(paint, count, 0, &skBounds);
337 333
338 const uint16_t* glyphs = glyphBuffer.glyphs(start); 334 const uint16_t* glyphs = glyphBuffer.glyphs(start);
339 std::copy(glyphs, glyphs + count, buffer.glyphs); 335 std::copy(glyphs, glyphs + count, buffer.glyphs);
340 336
341 const FloatSize* advances = glyphBuffer.advances(start); 337 const FloatSize* advances = glyphBuffer.advances(start);
342 for (unsigned j = 0; j < count; j++) { 338 for (unsigned j = 0; j < count; j++) {
343 buffer.pos[j] = x; 339 buffer.pos[j] = x;
344 x += SkFloatToScalar(advances[j].width()); 340 x += SkFloatToScalar(advances[j].width());
345 } 341 }
346 } 342 }
347 343
348 advance = x; 344 advance = x;
349 return adoptRef(builder.build()); 345 return adoptRef(builder.build());
350 } 346 }
351 347
352 } // namespace blink 348 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/fonts/Font.cpp ('k') | Source/platform/graphics/GraphicsContext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698