| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "gm.h" | 8 #include "gm.h" |
| 9 #include "SkBlurMask.h" | 9 #include "SkBlurMask.h" |
| 10 #include "SkBlurMaskFilter.h" | 10 #include "SkBlurMaskFilter.h" |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 canvas->drawPath(underline, paint); | 344 canvas->drawPath(underline, paint); |
| 345 | 345 |
| 346 canvas->translate(0, textSize * 1.3f); | 346 canvas->translate(0, textSize * 1.3f); |
| 347 } | 347 } |
| 348 canvas->translate(0, 60); | 348 canvas->translate(0, 60); |
| 349 } | 349 } |
| 350 } | 350 } |
| 351 | 351 |
| 352 namespace { | 352 namespace { |
| 353 | 353 |
| 354 sk_sp<const SkTextBlob> MakeFancyBlob(const SkPaint& paint, const char* text) { | 354 sk_sp<SkTextBlob> MakeFancyBlob(const SkPaint& paint, const char* text) { |
| 355 SkPaint blobPaint(paint); | 355 SkPaint blobPaint(paint); |
| 356 | 356 |
| 357 const size_t textLen = strlen(text); | 357 const size_t textLen = strlen(text); |
| 358 const int glyphCount = blobPaint.textToGlyphs(text, textLen, nullptr); | 358 const int glyphCount = blobPaint.textToGlyphs(text, textLen, nullptr); |
| 359 SkAutoTArray<SkGlyphID> glyphs(glyphCount); | 359 SkAutoTArray<SkGlyphID> glyphs(glyphCount); |
| 360 blobPaint.textToGlyphs(text, textLen, glyphs.get()); | 360 blobPaint.textToGlyphs(text, textLen, glyphs.get()); |
| 361 | 361 |
| 362 blobPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 362 blobPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
| 363 const size_t glyphTextBytes = SkTo<uint32_t>(glyphCount) * sizeof(SkGlyphID)
; | 363 const size_t glyphTextBytes = SkTo<uint32_t>(glyphCount) * sizeof(SkGlyphID)
; |
| 364 const int widthCount = blobPaint.getTextWidths(glyphs.get(), glyphTextBytes,
nullptr); | 364 const int widthCount = blobPaint.getTextWidths(glyphs.get(), glyphTextBytes,
nullptr); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 const SkTextBlobBuilder::RunBuffer& buf = blobBuilder.allocRunPos(blobPa
int, fullRunLen); | 404 const SkTextBlobBuilder::RunBuffer& buf = blobBuilder.allocRunPos(blobPa
int, fullRunLen); |
| 405 memcpy(buf.glyphs, glyphs.get() + glyphIndex, | 405 memcpy(buf.glyphs, glyphs.get() + glyphIndex, |
| 406 SkTo<uint32_t>(fullRunLen) * sizeof(SkGlyphID)); | 406 SkTo<uint32_t>(fullRunLen) * sizeof(SkGlyphID)); |
| 407 for (int i = 0; i < fullRunLen; ++i) { | 407 for (int i = 0; i < fullRunLen; ++i) { |
| 408 buf.pos[i * 2 + 0] = advance; // x offset | 408 buf.pos[i * 2 + 0] = advance; // x offset |
| 409 buf.pos[i * 2 + 1] = 0; // y offset | 409 buf.pos[i * 2 + 1] = 0; // y offset |
| 410 advance += widths[glyphIndex++]; | 410 advance += widths[glyphIndex++]; |
| 411 } | 411 } |
| 412 } | 412 } |
| 413 | 413 |
| 414 return sk_sp<const SkTextBlob>(blobBuilder.build()); | 414 return blobBuilder.make(); |
| 415 } | 415 } |
| 416 | 416 |
| 417 } // anonymous ns | 417 } // anonymous ns |
| 418 | 418 |
| 419 DEF_SIMPLE_GM(fancyblobunderline, canvas, 1480, 1380) { | 419 DEF_SIMPLE_GM(fancyblobunderline, canvas, 1480, 1380) { |
| 420 SkPaint paint; | 420 SkPaint paint; |
| 421 paint.setAntiAlias(true); | 421 paint.setAntiAlias(true); |
| 422 const char* fam[] = { "sans-serif", "serif", "monospace" }; | 422 const char* fam[] = { "sans-serif", "serif", "monospace" }; |
| 423 const char test[] = "aAjJgGyY_|{-(~[,]qQ}pP}zZ"; | 423 const char test[] = "aAjJgGyY_|{-(~[,]qQ}pP}zZ"; |
| 424 const SkPoint blobOffset = { 10, 80 }; | 424 const SkPoint blobOffset = { 10, 80 }; |
| 425 | 425 |
| 426 for (size_t font = 0; font < SK_ARRAY_COUNT(fam); ++font) { | 426 for (size_t font = 0; font < SK_ARRAY_COUNT(fam); ++font) { |
| 427 sk_tool_utils::set_portable_typeface(&paint, fam[font]); | 427 sk_tool_utils::set_portable_typeface(&paint, fam[font]); |
| 428 for (SkScalar textSize = 100; textSize > 10; textSize -= 20) { | 428 for (SkScalar textSize = 100; textSize > 10; textSize -= 20) { |
| 429 paint.setTextSize(textSize); | 429 paint.setTextSize(textSize); |
| 430 const SkScalar uWidth = textSize / 15; | 430 const SkScalar uWidth = textSize / 15; |
| 431 paint.setStrokeWidth(uWidth); | 431 paint.setStrokeWidth(uWidth); |
| 432 paint.setStyle(SkPaint::kFill_Style); | 432 paint.setStyle(SkPaint::kFill_Style); |
| 433 | 433 |
| 434 sk_sp<const SkTextBlob> blob = MakeFancyBlob(paint, test); | 434 sk_sp<SkTextBlob> blob = MakeFancyBlob(paint, test); |
| 435 canvas->drawTextBlob(blob.get(), blobOffset.x(), blobOffset.y(), pai
nt); | 435 canvas->drawTextBlob(blob, blobOffset.x(), blobOffset.y(), paint); |
| 436 | 436 |
| 437 const SkScalar uPos = uWidth; | 437 const SkScalar uPos = uWidth; |
| 438 const SkScalar bounds[2] = { uPos - uWidth / 2, uPos + uWidth / 2 }; | 438 const SkScalar bounds[2] = { uPos - uWidth / 2, uPos + uWidth / 2 }; |
| 439 const int interceptCount = paint.getTextBlobIntercepts(blob.get(), b
ounds, nullptr); | 439 const int interceptCount = paint.getTextBlobIntercepts(blob.get(), b
ounds, nullptr); |
| 440 SkASSERT(!(interceptCount % 2)); | 440 SkASSERT(!(interceptCount % 2)); |
| 441 | 441 |
| 442 SkTDArray<SkScalar> intercepts; | 442 SkTDArray<SkScalar> intercepts; |
| 443 intercepts.setCount(interceptCount); | 443 intercepts.setCount(interceptCount); |
| 444 paint.getTextBlobIntercepts(blob.get(), bounds, intercepts.begin()); | 444 paint.getTextBlobIntercepts(blob.get(), bounds, intercepts.begin()); |
| 445 | 445 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 | 489 |
| 490 SkScalar start = textPt.fX; | 490 SkScalar start = textPt.fX; |
| 491 SkScalar end = posX; | 491 SkScalar end = posX; |
| 492 SkScalar uPos = pos[0].fY + uWidth; | 492 SkScalar uPos = pos[0].fY + uWidth; |
| 493 SkPath underline = create_underline(intersections, start, end, uPos, uWi
dth, textSize); | 493 SkPath underline = create_underline(intersections, start, end, uPos, uWi
dth, textSize); |
| 494 paint.setStyle(SkPaint::kStroke_Style); | 494 paint.setStyle(SkPaint::kStroke_Style); |
| 495 canvas->drawPath(underline, paint); | 495 canvas->drawPath(underline, paint); |
| 496 canvas->translate(0, textSize * 1.3f); | 496 canvas->translate(0, textSize * 1.3f); |
| 497 } | 497 } |
| 498 } | 498 } |
| OLD | NEW |