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 "SkChecksum.h" | |
11 #include "SkDraw.h" | 12 #include "SkDraw.h" |
12 #include "SkPaint.h" | 13 #include "SkPaint.h" |
13 #include "SkParsePath.h" | 14 #include "SkParsePath.h" |
14 #include "SkPathOps.h" | 15 #include "SkPathOps.h" |
15 #include "SkShader.h" | 16 #include "SkShader.h" |
16 #include "SkStream.h" | 17 #include "SkStream.h" |
18 #include "SkTHash.h" | |
17 #include "SkTypeface.h" | 19 #include "SkTypeface.h" |
18 #include "SkUtils.h" | 20 #include "SkUtils.h" |
19 #include "SkXMLWriter.h" | 21 #include "SkXMLWriter.h" |
20 | 22 |
21 namespace { | 23 namespace { |
22 | 24 |
23 static SkString svg_color(SkColor color) { | 25 static SkString svg_color(SkColor color) { |
24 return SkStringPrintf("rgb(%u,%u,%u)", | 26 return SkStringPrintf("rgb(%u,%u,%u)", |
25 SkColorGetR(color), | 27 SkColorGetR(color), |
26 SkColorGetG(color), | 28 SkColorGetG(color), |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
157 append_escaped_unichar(c32[i], &svgText); | 159 append_escaped_unichar(c32[i], &svgText); |
158 } | 160 } |
159 } break; | 161 } break; |
160 default: | 162 default: |
161 SkFAIL("unknown text encoding"); | 163 SkFAIL("unknown text encoding"); |
162 } | 164 } |
163 | 165 |
164 return svgText; | 166 return svgText; |
165 } | 167 } |
166 | 168 |
169 uint32_t hash_family_string(const SkString& family) { | |
170 // This is a lame hash function, but we don't really expect to see more than 1-2 | |
mtklein
2015/02/13 15:01:20
At least, it is not without precedent:
http://www
| |
171 // family names under normal circumstances. | |
172 return SkChecksum::Mix(SkToU32(family.size())); | |
173 } | |
174 | |
167 struct Resources { | 175 struct Resources { |
168 Resources(const SkPaint& paint) | 176 Resources(const SkPaint& paint) |
169 : fPaintServer(svg_color(paint.getColor())) {} | 177 : fPaintServer(svg_color(paint.getColor())) {} |
170 | 178 |
171 SkString fPaintServer; | 179 SkString fPaintServer; |
172 SkString fClip; | 180 SkString fClip; |
173 }; | 181 }; |
174 | 182 |
175 } | 183 } |
176 | 184 |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 this->addAttribute("font-size", paint.getTextSize()); | 459 this->addAttribute("font-size", paint.getTextSize()); |
452 | 460 |
453 SkTypeface::Style style = paint.getTypeface()->style(); | 461 SkTypeface::Style style = paint.getTypeface()->style(); |
454 if (style & SkTypeface::kItalic) { | 462 if (style & SkTypeface::kItalic) { |
455 this->addAttribute("font-style", "italic"); | 463 this->addAttribute("font-style", "italic"); |
456 } | 464 } |
457 if (style & SkTypeface::kBold) { | 465 if (style & SkTypeface::kBold) { |
458 this->addAttribute("font-weight", "bold"); | 466 this->addAttribute("font-weight", "bold"); |
459 } | 467 } |
460 | 468 |
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())) { | 469 if (const char* textAlign = svg_text_align(paint.getTextAlign())) { |
470 this->addAttribute("text-anchor", textAlign); | 470 this->addAttribute("text-anchor", textAlign); |
471 } | 471 } |
472 | |
473 SkString familyName; | |
474 SkTHashSet<SkString, hash_family_string> familySet; | |
475 SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ? | |
476 SkRef(paint.getTypeface()) : SkTypeface::RefDefault(style)); | |
477 SkAutoTUnref<SkTypeface::LocalizedStrings> familyNameIter(tface->createFamil yNameIterator()); | |
478 SkTypeface::LocalizedString familyString; | |
479 while (familyNameIter->next(&familyString)) { | |
480 if (familySet.contains(familyString.fString)) { | |
481 continue; | |
482 } | |
483 familySet.add(familyString.fString); | |
mtklein
2015/02/13 15:01:20
Well, now I want SkTHashSet's add to return a bool
f(malita)
2015/02/13 15:24:09
Ack.
Yeah, that would let us avoid a double hash
| |
484 familyName.appendf((familyName.isEmpty() ? "%s" : ", %s"), familyString. fString.c_str()); | |
485 } | |
486 | |
487 if (!familyName.isEmpty()) { | |
488 this->addAttribute("font-family", familyName); | |
489 } | |
472 } | 490 } |
473 | 491 |
474 SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkXMLWriter* writer) { | 492 SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkXMLWriter* writer) { |
475 if (!writer) { | 493 if (!writer) { |
476 return NULL; | 494 return NULL; |
477 } | 495 } |
478 | 496 |
479 return SkNEW_ARGS(SkSVGDevice, (size, writer)); | 497 return SkNEW_ARGS(SkSVGDevice, (size, writer)); |
480 } | 498 } |
481 | 499 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
642 const SkPaint& paint) { | 660 const SkPaint& paint) { |
643 // todo | 661 // todo |
644 SkDebugf("unsupported operation: drawVertices()\n"); | 662 SkDebugf("unsupported operation: drawVertices()\n"); |
645 } | 663 } |
646 | 664 |
647 void SkSVGDevice::drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, | 665 void SkSVGDevice::drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, |
648 const SkPaint&) { | 666 const SkPaint&) { |
649 // todo | 667 // todo |
650 SkDebugf("unsupported operation: drawDevice()\n"); | 668 SkDebugf("unsupported operation: drawDevice()\n"); |
651 } | 669 } |
OLD | NEW |