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

Side by Side Diff: src/ports/SkFontHost_FreeType_common.cpp

Issue 2139703002: Rotate emoji with FreeType. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Less invasive, update comments. Created 4 years, 5 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
« no previous file with comments | « src/ports/SkFontHost_FreeType_common.h ('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 2006-2012 The Android Open Source Project 2 * Copyright 2006-2012 The Android Open Source Project
3 * Copyright 2012 Mozilla Foundation 3 * Copyright 2012 Mozilla Foundation
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 case SkMask::kLCD16_Format: 327 case SkMask::kLCD16_Format:
328 return kAlpha_8_SkColorType; 328 return kAlpha_8_SkColorType;
329 case SkMask::kARGB32_Format: 329 case SkMask::kARGB32_Format:
330 return kN32_SkColorType; 330 return kN32_SkColorType;
331 default: 331 default:
332 SkDEBUGFAIL("unsupported destination SkBitmap::Config"); 332 SkDEBUGFAIL("unsupported destination SkBitmap::Config");
333 return kAlpha_8_SkColorType; 333 return kAlpha_8_SkColorType;
334 } 334 }
335 } 335 }
336 336
337 void SkScalerContext_FreeType_Base::generateGlyphImage(FT_Face face, const SkGly ph& glyph) { 337 void SkScalerContext_FreeType_Base::generateGlyphImage(
338 FT_Face face,
339 const SkGlyph& glyph,
340 const SkMatrix& bitmapTransform)
341 {
338 const bool doBGR = SkToBool(fRec.fFlags & SkScalerContext::kLCD_BGROrder_Fla g); 342 const bool doBGR = SkToBool(fRec.fFlags & SkScalerContext::kLCD_BGROrder_Fla g);
339 const bool doVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Fl ag); 343 const bool doVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Fl ag);
340 344
341 switch ( face->glyph->format ) { 345 switch ( face->glyph->format ) {
342 case FT_GLYPH_FORMAT_OUTLINE: { 346 case FT_GLYPH_FORMAT_OUTLINE: {
343 FT_Outline* outline = &face->glyph->outline; 347 FT_Outline* outline = &face->glyph->outline;
344 FT_BBox bbox; 348 FT_BBox bbox;
345 FT_Bitmap target; 349 FT_Bitmap target;
346 350
347 int dx = 0, dy = 0; 351 int dx = 0, dy = 0;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 408
405 if (fRec.fFlags & SkScalerContext::kEmbolden_Flag && 409 if (fRec.fFlags & SkScalerContext::kEmbolden_Flag &&
406 !(face->style_flags & FT_STYLE_FLAG_BOLD)) 410 !(face->style_flags & FT_STYLE_FLAG_BOLD))
407 { 411 {
408 FT_GlyphSlot_Own_Bitmap(face->glyph); 412 FT_GlyphSlot_Own_Bitmap(face->glyph);
409 FT_Bitmap_Embolden(face->glyph->library, &face->glyph->bitmap, 413 FT_Bitmap_Embolden(face->glyph->library, &face->glyph->bitmap,
410 kBitmapEmboldenStrength, 0); 414 kBitmapEmboldenStrength, 0);
411 } 415 }
412 416
413 // If no scaling needed, directly copy glyph bitmap. 417 // If no scaling needed, directly copy glyph bitmap.
414 if (glyph.fWidth == face->glyph->bitmap.width && 418 if (bitmapTransform.isIdentity()) {
415 glyph.fHeight == face->glyph->bitmap.rows &&
416 glyph.fTop == -face->glyph->bitmap_top &&
417 glyph.fLeft == face->glyph->bitmap_left)
418 {
419 SkMask dstMask; 419 SkMask dstMask;
420 glyph.toMask(&dstMask); 420 glyph.toMask(&dstMask);
421 copyFTBitmap(face->glyph->bitmap, dstMask); 421 copyFTBitmap(face->glyph->bitmap, dstMask);
422 break; 422 break;
423 } 423 }
424 424
425 // Otherwise, scale the bitmap. 425 // Otherwise, scale the bitmap.
426 426
427 // Copy the FT_Bitmap into an SkBitmap (either A8 or ARGB) 427 // Copy the FT_Bitmap into an SkBitmap (either A8 or ARGB)
428 SkBitmap unscaledBitmap; 428 SkBitmap unscaledBitmap;
(...skipping 23 matching lines...) Expand all
452 kPremul_SkAlphaType), 452 kPremul_SkAlphaType),
453 bitmapRowBytes); 453 bitmapRowBytes);
454 if (SkMask::kBW_Format == maskFormat || SkMask::kLCD16_Format == mas kFormat) { 454 if (SkMask::kBW_Format == maskFormat || SkMask::kLCD16_Format == mas kFormat) {
455 dstBitmap.allocPixels(); 455 dstBitmap.allocPixels();
456 } else { 456 } else {
457 dstBitmap.setPixels(glyph.fImage); 457 dstBitmap.setPixels(glyph.fImage);
458 } 458 }
459 459
460 // Scale unscaledBitmap into dstBitmap. 460 // Scale unscaledBitmap into dstBitmap.
461 SkCanvas canvas(dstBitmap); 461 SkCanvas canvas(dstBitmap);
462 #ifdef SK_SHOW_TEXT_BLIT_COVERAGE
463 canvas.clear(0x33FF0000);
464 #else
462 canvas.clear(SK_ColorTRANSPARENT); 465 canvas.clear(SK_ColorTRANSPARENT);
463 canvas.scale(SkIntToScalar(glyph.fWidth) / SkIntToScalar(face->glyph ->bitmap.width), 466 #endif
464 SkIntToScalar(glyph.fHeight) / SkIntToScalar(face->glyp h->bitmap.rows)); 467 canvas.translate(-glyph.fLeft, -glyph.fTop);
468 canvas.concat(bitmapTransform);
bungeman-skia 2016/07/11 22:18:42 For the no-skew case everything is the same except
469 canvas.translate(face->glyph->bitmap_left, -face->glyph->bitmap_top) ;
470
465 SkPaint paint; 471 SkPaint paint;
466 paint.setFilterQuality(kMedium_SkFilterQuality); 472 paint.setFilterQuality(kMedium_SkFilterQuality);
467 canvas.drawBitmap(unscaledBitmap, 0, 0, &paint); 473 canvas.drawBitmap(unscaledBitmap, 0, 0, &paint);
468 474
469 // If the destination is BW or LCD, convert from A8. 475 // If the destination is BW or LCD, convert from A8.
470 if (SkMask::kBW_Format == maskFormat) { 476 if (SkMask::kBW_Format == maskFormat) {
471 // Copy the A8 dstBitmap into the A1 glyph.fImage. 477 // Copy the A8 dstBitmap into the A1 glyph.fImage.
472 SkMask dstMask; 478 SkMask dstMask;
473 glyph.toMask(&dstMask); 479 glyph.toMask(&dstMask);
474 packA8ToA1(dstMask, dstBitmap.getAddr8(0, 0), dstBitmap.rowBytes ()); 480 packA8ToA1(dstMask, dstBitmap.getAddr8(0, 0), dstBitmap.rowBytes ());
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 562
557 FT_Error err = FT_Outline_Decompose(&face->glyph->outline, &funcs, path); 563 FT_Error err = FT_Outline_Decompose(&face->glyph->outline, &funcs, path);
558 564
559 if (err != 0) { 565 if (err != 0) {
560 path->reset(); 566 path->reset();
561 return; 567 return;
562 } 568 }
563 569
564 path->close(); 570 path->close();
565 } 571 }
OLDNEW
« no previous file with comments | « src/ports/SkFontHost_FreeType_common.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698