OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkSVGDevice.h" | 8 #include "SkSVGDevice.h" |
9 | 9 |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
11 #include "SkDraw.h" | 11 #include "SkDraw.h" |
12 #include "SkPaint.h" | 12 #include "SkPaint.h" |
13 #include "SkParsePath.h" | 13 #include "SkParsePath.h" |
14 #include "SkPathOps.h" | 14 #include "SkPathOps.h" |
15 #include "SkShader.h" | 15 #include "SkShader.h" |
16 #include "SkStream.h" | 16 #include "SkStream.h" |
| 17 #include "SkTArray.h" |
17 #include "SkTypeface.h" | 18 #include "SkTypeface.h" |
18 #include "SkUtils.h" | 19 #include "SkUtils.h" |
19 #include "SkXMLWriter.h" | 20 #include "SkXMLWriter.h" |
20 | 21 |
21 namespace { | 22 namespace { |
22 | 23 |
23 static SkString svg_color(SkColor color) { | 24 static SkString svg_color(SkColor color) { |
24 return SkStringPrintf("rgb(%u,%u,%u)", | 25 return SkStringPrintf("rgb(%u,%u,%u)", |
25 SkColorGetR(color), | 26 SkColorGetR(color), |
26 SkColorGetG(color), | 27 SkColorGetG(color), |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 this->addAttribute("font-size", paint.getTextSize()); | 452 this->addAttribute("font-size", paint.getTextSize()); |
452 | 453 |
453 SkTypeface::Style style = paint.getTypeface()->style(); | 454 SkTypeface::Style style = paint.getTypeface()->style(); |
454 if (style & SkTypeface::kItalic) { | 455 if (style & SkTypeface::kItalic) { |
455 this->addAttribute("font-style", "italic"); | 456 this->addAttribute("font-style", "italic"); |
456 } | 457 } |
457 if (style & SkTypeface::kBold) { | 458 if (style & SkTypeface::kBold) { |
458 this->addAttribute("font-weight", "bold"); | 459 this->addAttribute("font-weight", "bold"); |
459 } | 460 } |
460 | 461 |
461 SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ? | |
462 SkRef(paint.getTypeface()) : SkTypeface::RefDefault(style)); | |
463 SkString familyName; | |
464 tface->getFamilyName(&familyName); | |
465 if (!familyName.isEmpty()) { | |
466 this->addAttribute("font-family", familyName); | |
467 } | |
468 | |
469 if (const char* textAlign = svg_text_align(paint.getTextAlign())) { | 462 if (const char* textAlign = svg_text_align(paint.getTextAlign())) { |
470 this->addAttribute("text-anchor", textAlign); | 463 this->addAttribute("text-anchor", textAlign); |
471 } | 464 } |
| 465 |
| 466 SkString familyName; |
| 467 SkTArray<SkString> familyNamesSet; |
| 468 SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ? |
| 469 SkRef(paint.getTypeface()) : SkTypeface::RefDefault(style)); |
| 470 SkAutoTUnref<SkTypeface::LocalizedStrings> familyNameIter(tface->createFamil
yNameIterator()); |
| 471 SkTypeface::LocalizedString familyString; |
| 472 while (familyNameIter->next(&familyString)) { |
| 473 // !!linear search!! In general we expect a small number of names so thi
s should be ok. |
| 474 if (familyNamesSet.rfind(familyString.fString) < 0) { |
| 475 familyNamesSet.push_back() = familyString.fString; |
| 476 familyName.appendf((familyName.isEmpty() ? "%s" : ", %s"), |
| 477 familyString.fString.c_str()); |
| 478 } |
| 479 } |
| 480 |
| 481 if (!familyName.isEmpty()) { |
| 482 this->addAttribute("font-family", familyName); |
| 483 } |
472 } | 484 } |
473 | 485 |
474 SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkXMLWriter* writer) { | 486 SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkXMLWriter* writer) { |
475 if (!writer) { | 487 if (!writer) { |
476 return NULL; | 488 return NULL; |
477 } | 489 } |
478 | 490 |
479 return SkNEW_ARGS(SkSVGDevice, (size, writer)); | 491 return SkNEW_ARGS(SkSVGDevice, (size, writer)); |
480 } | 492 } |
481 | 493 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 const SkPaint& paint) { | 654 const SkPaint& paint) { |
643 // todo | 655 // todo |
644 SkDebugf("unsupported operation: drawVertices()\n"); | 656 SkDebugf("unsupported operation: drawVertices()\n"); |
645 } | 657 } |
646 | 658 |
647 void SkSVGDevice::drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, | 659 void SkSVGDevice::drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, |
648 const SkPaint&) { | 660 const SkPaint&) { |
649 // todo | 661 // todo |
650 SkDebugf("unsupported operation: drawDevice()\n"); | 662 SkDebugf("unsupported operation: drawDevice()\n"); |
651 } | 663 } |
OLD | NEW |