| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 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 | 9 |
| 10 #include "SkScalerContext.h" | 10 #include "SkScalerContext.h" |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 goto SK_ERROR; | 174 goto SK_ERROR; |
| 175 } | 175 } |
| 176 glyph->fLeft = ir.fLeft; | 176 glyph->fLeft = ir.fLeft; |
| 177 glyph->fTop = ir.fTop; | 177 glyph->fTop = ir.fTop; |
| 178 glyph->fWidth = SkToU16(ir.width()); | 178 glyph->fWidth = SkToU16(ir.width()); |
| 179 glyph->fHeight = SkToU16(ir.height()); | 179 glyph->fHeight = SkToU16(ir.height()); |
| 180 | 180 |
| 181 if (glyph->fWidth > 0) { | 181 if (glyph->fWidth > 0) { |
| 182 switch (fRec.fMaskFormat) { | 182 switch (fRec.fMaskFormat) { |
| 183 case SkMask::kLCD16_Format: | 183 case SkMask::kLCD16_Format: |
| 184 case SkMask::kLCD32_Format: | |
| 185 glyph->fWidth += 2; | 184 glyph->fWidth += 2; |
| 186 glyph->fLeft -= 1; | 185 glyph->fLeft -= 1; |
| 187 break; | 186 break; |
| 188 default: | 187 default: |
| 189 break; | 188 break; |
| 190 } | 189 } |
| 191 } | 190 } |
| 192 } | 191 } |
| 193 } | 192 } |
| 194 | 193 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 U8CPU b = sk_apply_lut_if<APPLY_PREBLEND>(fir[2], maskPreBlend.fB); | 317 U8CPU b = sk_apply_lut_if<APPLY_PREBLEND>(fir[2], maskPreBlend.fB); |
| 319 #if SK_SHOW_TEXT_BLIT_COVERAGE | 318 #if SK_SHOW_TEXT_BLIT_COVERAGE |
| 320 r = SkMax32(r, 10); g = SkMax32(g, 10); b = SkMax32(b, 10); | 319 r = SkMax32(r, 10); g = SkMax32(g, 10); b = SkMax32(b, 10); |
| 321 #endif | 320 #endif |
| 322 dstP[pixel_x] = SkPack888ToRGB16(r, g, b); | 321 dstP[pixel_x] = SkPack888ToRGB16(r, g, b); |
| 323 } | 322 } |
| 324 dstP = (uint16_t*)((char*)dstP + dstRB); | 323 dstP = (uint16_t*)((char*)dstP + dstRB); |
| 325 } | 324 } |
| 326 } | 325 } |
| 327 | 326 |
| 328 template<bool APPLY_PREBLEND> | |
| 329 static void pack4xHToLCD32(const SkBitmap& src, const SkMask& dst, | |
| 330 const SkMaskGamma::PreBlend& maskPreBlend) { | |
| 331 SkASSERT(kAlpha_8_SkColorType == src.colorType()); | |
| 332 SkASSERT(SkMask::kLCD32_Format == dst.fFormat); | |
| 333 | |
| 334 const int width = dst.fBounds.width(); | |
| 335 const int height = dst.fBounds.height(); | |
| 336 SkPMColor* dstP = (SkPMColor*)dst.fImage; | |
| 337 size_t dstRB = dst.fRowBytes; | |
| 338 | |
| 339 for (int y = 0; y < height; ++y) { | |
| 340 const uint8_t* srcP = src.getAddr8(0, y); | |
| 341 | |
| 342 // TODO: need to use fir filter here as well. | |
| 343 for (int x = 0; x < width; ++x) { | |
| 344 U8CPU r = sk_apply_lut_if<APPLY_PREBLEND>(*srcP++, maskPreBlend.fR); | |
| 345 U8CPU g = sk_apply_lut_if<APPLY_PREBLEND>(*srcP++, maskPreBlend.fG); | |
| 346 U8CPU b = sk_apply_lut_if<APPLY_PREBLEND>(*srcP++, maskPreBlend.fB); | |
| 347 dstP[x] = SkPackARGB32(0xFF, r, g, b); | |
| 348 } | |
| 349 dstP = (SkPMColor*)((char*)dstP + dstRB); | |
| 350 } | |
| 351 } | |
| 352 | |
| 353 static inline int convert_8_to_1(unsigned byte) { | 327 static inline int convert_8_to_1(unsigned byte) { |
| 354 SkASSERT(byte <= 0xFF); | 328 SkASSERT(byte <= 0xFF); |
| 355 return byte >> 7; | 329 return byte >> 7; |
| 356 } | 330 } |
| 357 | 331 |
| 358 static uint8_t pack_8_to_1(const uint8_t alpha[8]) { | 332 static uint8_t pack_8_to_1(const uint8_t alpha[8]) { |
| 359 unsigned bits = 0; | 333 unsigned bits = 0; |
| 360 for (int i = 0; i < 8; ++i) { | 334 for (int i = 0; i < 8; ++i) { |
| 361 bits <<= 1; | 335 bits <<= 1; |
| 362 bits |= convert_8_to_1(alpha[i]); | 336 bits |= convert_8_to_1(alpha[i]); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 -SkIntToScalar(mask.fBounds.fTop)); | 385 -SkIntToScalar(mask.fBounds.fTop)); |
| 412 | 386 |
| 413 paint.setAntiAlias(SkMask::kBW_Format != mask.fFormat); | 387 paint.setAntiAlias(SkMask::kBW_Format != mask.fFormat); |
| 414 switch (mask.fFormat) { | 388 switch (mask.fFormat) { |
| 415 case SkMask::kBW_Format: | 389 case SkMask::kBW_Format: |
| 416 dstRB = 0; // signals we need a copy | 390 dstRB = 0; // signals we need a copy |
| 417 break; | 391 break; |
| 418 case SkMask::kA8_Format: | 392 case SkMask::kA8_Format: |
| 419 break; | 393 break; |
| 420 case SkMask::kLCD16_Format: | 394 case SkMask::kLCD16_Format: |
| 421 case SkMask::kLCD32_Format: | |
| 422 // TODO: trigger off LCD orientation | 395 // TODO: trigger off LCD orientation |
| 423 dstW = 4*dstW - 8; | 396 dstW = 4*dstW - 8; |
| 424 matrix.setTranslate(-SkIntToScalar(mask.fBounds.fLeft + 1), | 397 matrix.setTranslate(-SkIntToScalar(mask.fBounds.fLeft + 1), |
| 425 -SkIntToScalar(mask.fBounds.fTop)); | 398 -SkIntToScalar(mask.fBounds.fTop)); |
| 426 matrix.postScale(SkIntToScalar(4), SK_Scalar1); | 399 matrix.postScale(SkIntToScalar(4), SK_Scalar1); |
| 427 dstRB = 0; // signals we need a copy | 400 dstRB = 0; // signals we need a copy |
| 428 break; | 401 break; |
| 429 default: | 402 default: |
| 430 SkDEBUGFAIL("unexpected mask format"); | 403 SkDEBUGFAIL("unexpected mask format"); |
| 431 } | 404 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 applyLUTToA8Mask(mask, maskPreBlend.fG); | 436 applyLUTToA8Mask(mask, maskPreBlend.fG); |
| 464 } | 437 } |
| 465 break; | 438 break; |
| 466 case SkMask::kLCD16_Format: | 439 case SkMask::kLCD16_Format: |
| 467 if (maskPreBlend.isApplicable()) { | 440 if (maskPreBlend.isApplicable()) { |
| 468 pack4xHToLCD16<true>(bm, mask, maskPreBlend); | 441 pack4xHToLCD16<true>(bm, mask, maskPreBlend); |
| 469 } else { | 442 } else { |
| 470 pack4xHToLCD16<false>(bm, mask, maskPreBlend); | 443 pack4xHToLCD16<false>(bm, mask, maskPreBlend); |
| 471 } | 444 } |
| 472 break; | 445 break; |
| 473 case SkMask::kLCD32_Format: | |
| 474 if (maskPreBlend.isApplicable()) { | |
| 475 pack4xHToLCD32<true>(bm, mask, maskPreBlend); | |
| 476 } else { | |
| 477 pack4xHToLCD32<false>(bm, mask, maskPreBlend); | |
| 478 } | |
| 479 break; | |
| 480 default: | 446 default: |
| 481 break; | 447 break; |
| 482 } | 448 } |
| 483 } | 449 } |
| 484 | 450 |
| 485 static void extract_alpha(const SkMask& dst, | 451 static void extract_alpha(const SkMask& dst, |
| 486 const SkPMColor* srcRow, size_t srcRB) { | 452 const SkPMColor* srcRow, size_t srcRB) { |
| 487 int width = dst.fBounds.width(); | 453 int width = dst.fBounds.width(); |
| 488 int height = dst.fBounds.height(); | 454 int height = dst.fBounds.height(); |
| 489 int dstRB = dst.fRowBytes; | 455 int dstRB = dst.fRowBytes; |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 SkScalerContext* SkTypeface::createScalerContext(const SkDescriptor* desc, | 758 SkScalerContext* SkTypeface::createScalerContext(const SkDescriptor* desc, |
| 793 bool allowFailure) const { | 759 bool allowFailure) const { |
| 794 SkScalerContext* c = this->onCreateScalerContext(desc); | 760 SkScalerContext* c = this->onCreateScalerContext(desc); |
| 795 | 761 |
| 796 if (!c && !allowFailure) { | 762 if (!c && !allowFailure) { |
| 797 c = SkNEW_ARGS(SkScalerContext_Empty, | 763 c = SkNEW_ARGS(SkScalerContext_Empty, |
| 798 (const_cast<SkTypeface*>(this), desc)); | 764 (const_cast<SkTypeface*>(this), desc)); |
| 799 } | 765 } |
| 800 return c; | 766 return c; |
| 801 } | 767 } |
| OLD | NEW |