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

Side by Side Diff: Source/platform/fonts/Font.cpp

Issue 856613002: Always use deferred text blob bounds. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: TestExpectations (progressions) Created 5 years, 11 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 | « LayoutTests/TestExpectations ('k') | no next file » | 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) 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 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 if (cacheEntry && (!fallbackFonts || fallbackFonts->isEmpty())) { 249 if (cacheEntry && (!fallbackFonts || fallbackFonts->isEmpty())) {
250 cacheEntry->glyphBounds = glyphBounds; 250 cacheEntry->glyphBounds = glyphBounds;
251 cacheEntry->width = result; 251 cacheEntry->width = result;
252 } 252 }
253 253
254 if (glyphOverflow) 254 if (glyphOverflow)
255 updateGlyphOverflowFromBounds(glyphBounds, fontMetrics(), glyphOverflow) ; 255 updateGlyphOverflowFromBounds(glyphBounds, fontMetrics(), glyphOverflow) ;
256 return result; 256 return result;
257 } 257 }
258 258
259 static bool requiresRecomputingBounds(const Font& font, const FloatRect& bounds)
260 {
261 // Blobs should never have empty bounds, but see http://crbug.com/445527
262 if (bounds.isEmpty())
263 return true;
264
265 const FontDescription& fontDescription = font.fontDescription();
266 return fontDescription.letterSpacing() < 0 || fontDescription.wordSpacing() < 0;
267 }
268
269 PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, const FloatR ect& bounds, 259 PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, const FloatR ect& bounds,
270 bool couldUseLCD) const 260 bool couldUseLCD) const
271 { 261 {
272 ASSERT(RuntimeEnabledFeatures::textBlobEnabled()); 262 ASSERT(RuntimeEnabledFeatures::textBlobEnabled());
273 263
274 SkTextBlobBuilder builder; 264 SkTextBlobBuilder builder;
275 SkRect skBounds = bounds;
276 // FIXME: Identify these cases earlier on and avoid using bounds that are
277 // not visually correct in other places.
278 const SkRect* skBoundsPtr = requiresRecomputingBounds(*this, bounds) ? nullp tr : &skBounds;
279 bool hasVerticalOffsets = glyphBuffer.hasVerticalOffsets(); 265 bool hasVerticalOffsets = glyphBuffer.hasVerticalOffsets();
280 266
281 unsigned i = 0; 267 unsigned i = 0;
282 while (i < glyphBuffer.size()) { 268 while (i < glyphBuffer.size()) {
283 const SimpleFontData* fontData = glyphBuffer.fontDataAt(i); 269 const SimpleFontData* fontData = glyphBuffer.fontDataAt(i);
284 270
285 // FIXME: Handle vertical text. 271 // FIXME: Handle vertical text.
286 if (fontData->platformData().orientation() == Vertical) 272 if (fontData->platformData().orientation() == Vertical)
287 return nullptr; 273 return nullptr;
288 274
289 // FIXME: FontPlatformData makes some decisions on the device scale 275 // FIXME: FontPlatformData makes some decisions on the device scale
290 // factor, which is found via the GraphicsContext. This should be fixed 276 // factor, which is found via the GraphicsContext. This should be fixed
291 // to avoid correctness problems here. 277 // to avoid correctness problems here.
292 SkPaint paint; 278 SkPaint paint;
293 fontData->platformData().setupPaint(&paint, 0, this); 279 fontData->platformData().setupPaint(&paint, 0, this);
294 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 280 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
295 281
296 // FIXME: this should go away after the big LCD cleanup. 282 // FIXME: this should go away after the big LCD cleanup.
297 paint.setLCDRenderText(paint.isLCDRenderText() && couldUseLCD); 283 paint.setLCDRenderText(paint.isLCDRenderText() && couldUseLCD);
298 284
299 unsigned start = i++; 285 unsigned start = i++;
300 while (i < glyphBuffer.size() && glyphBuffer.fontDataAt(i) == fontData) 286 while (i < glyphBuffer.size() && glyphBuffer.fontDataAt(i) == fontData)
301 i++; 287 i++;
302 unsigned count = i - start; 288 unsigned count = i - start;
303 289
304 const SkTextBlobBuilder::RunBuffer& buffer = hasVerticalOffsets 290 const SkTextBlobBuilder::RunBuffer& buffer = hasVerticalOffsets
305 ? builder.allocRunPos(paint, count, skBoundsPtr) 291 ? builder.allocRunPos(paint, count)
306 : builder.allocRunPosH(paint, count, 0, skBoundsPtr); 292 : builder.allocRunPosH(paint, count, 0);
307 293
308 const uint16_t* glyphs = glyphBuffer.glyphs(start); 294 const uint16_t* glyphs = glyphBuffer.glyphs(start);
309 const float* offsets = glyphBuffer.offsets(start); 295 const float* offsets = glyphBuffer.offsets(start);
310 std::copy(glyphs, glyphs + count, buffer.glyphs); 296 std::copy(glyphs, glyphs + count, buffer.glyphs);
311 std::copy(offsets, offsets + (hasVerticalOffsets ? 2 * count : count), b uffer.pos); 297 std::copy(offsets, offsets + (hasVerticalOffsets ? 2 * count : count), b uffer.pos);
312 } 298 }
313 299
314 return adoptRef(builder.build()); 300 return adoptRef(builder.build());
315 } 301 }
316 302
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 if (delta <= 0) 952 if (delta <= 0)
967 break; 953 break;
968 } 954 }
969 } 955 }
970 } 956 }
971 957
972 return offset; 958 return offset;
973 } 959 }
974 960
975 } // namespace blink 961 } // namespace blink
OLDNEW
« no previous file with comments | « LayoutTests/TestExpectations ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698