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 "SkPDFDevice.h" | 8 #include "SkPDFDevice.h" |
9 | 9 |
10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 result.setStyle(SkPaint::kStrokeAndFill_Style); | 73 result.setStyle(SkPaint::kStrokeAndFill_Style); |
74 } else { | 74 } else { |
75 width += result.getStrokeWidth(); | 75 width += result.getStrokeWidth(); |
76 } | 76 } |
77 result.setStrokeWidth(width); | 77 result.setStrokeWidth(width); |
78 } | 78 } |
79 return result; | 79 return result; |
80 } | 80 } |
81 | 81 |
82 // Stolen from measure_text in SkDraw.cpp and then tweaked. | 82 // Stolen from measure_text in SkDraw.cpp and then tweaked. |
83 static void align_text(SkDrawCacheProc glyphCacheProc, const SkPaint& paint, | 83 static void align_text(SkPaint::GlyphCacheProc glyphCacheProc, const SkPaint& pa
int, |
84 const uint16_t* glyphs, size_t len, | 84 const uint16_t* glyphs, size_t len, |
85 SkScalar* x, SkScalar* y) { | 85 SkScalar* x, SkScalar* y) { |
86 if (paint.getTextAlign() == SkPaint::kLeft_Align) { | 86 if (paint.getTextAlign() == SkPaint::kLeft_Align) { |
87 return; | 87 return; |
88 } | 88 } |
89 | 89 |
90 SkMatrix ident; | 90 SkMatrix ident; |
91 ident.reset(); | 91 ident.reset(); |
92 SkAutoGlyphCache autoCache(paint, nullptr, &ident); | 92 SkAutoGlyphCache autoCache(paint, nullptr, &ident); |
93 SkGlyphCache* cache = autoCache.getCache(); | 93 SkGlyphCache* cache = autoCache.getCache(); |
94 | 94 |
95 const char* start = reinterpret_cast<const char*>(glyphs); | 95 const char* start = reinterpret_cast<const char*>(glyphs); |
96 const char* stop = reinterpret_cast<const char*>(glyphs + len); | 96 const char* stop = reinterpret_cast<const char*>(glyphs + len); |
97 SkFixed xAdv = 0, yAdv = 0; | 97 SkFixed xAdv = 0, yAdv = 0; |
98 | 98 |
99 // TODO(vandebo): This probably needs to take kerning into account. | 99 // TODO(vandebo): This probably needs to take kerning into account. |
100 while (start < stop) { | 100 while (start < stop) { |
101 const SkGlyph& glyph = glyphCacheProc(cache, &start, 0, 0); | 101 const SkGlyph& glyph = glyphCacheProc(cache, &start); |
102 xAdv += glyph.fAdvanceX; | 102 xAdv += glyph.fAdvanceX; |
103 yAdv += glyph.fAdvanceY; | 103 yAdv += glyph.fAdvanceY; |
104 }; | 104 }; |
105 if (paint.getTextAlign() == SkPaint::kLeft_Align) { | 105 if (paint.getTextAlign() == SkPaint::kLeft_Align) { |
106 return; | 106 return; |
107 } | 107 } |
108 | 108 |
109 SkScalar xAdj = SkFixedToScalar(xAdv); | 109 SkScalar xAdj = SkFixedToScalar(xAdv); |
110 SkScalar yAdj = SkFixedToScalar(yAdv); | 110 SkScalar yAdj = SkFixedToScalar(yAdv); |
111 if (paint.getTextAlign() == SkPaint::kCenter_Align) { | 111 if (paint.getTextAlign() == SkPaint::kCenter_Align) { |
(...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 ScopedContentEntry content(this, d, textPaint, true); | 1295 ScopedContentEntry content(this, d, textPaint, true); |
1296 if (!content.entry()) { | 1296 if (!content.entry()) { |
1297 return; | 1297 return; |
1298 } | 1298 } |
1299 | 1299 |
1300 SkGlyphStorage storage(0); | 1300 SkGlyphStorage storage(0); |
1301 const uint16_t* glyphIDs = nullptr; | 1301 const uint16_t* glyphIDs = nullptr; |
1302 int numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs); | 1302 int numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs); |
1303 textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 1303 textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
1304 | 1304 |
1305 SkDrawCacheProc glyphCacheProc = textPaint.getDrawCacheProc(); | 1305 SkPaint::GlyphCacheProc glyphCacheProc = textPaint.getGlyphCacheProc(true); |
1306 align_text(glyphCacheProc, textPaint, glyphIDs, numGlyphs, &x, &y); | 1306 align_text(glyphCacheProc, textPaint, glyphIDs, numGlyphs, &x, &y); |
1307 content.entry()->fContent.writeText("BT\n"); | 1307 content.entry()->fContent.writeText("BT\n"); |
1308 set_text_transform(x, y, textPaint.getTextSkewX(), | 1308 set_text_transform(x, y, textPaint.getTextSkewX(), |
1309 &content.entry()->fContent); | 1309 &content.entry()->fContent); |
1310 int consumedGlyphCount = 0; | 1310 int consumedGlyphCount = 0; |
1311 | 1311 |
1312 SkTDArray<uint16_t> glyphIDsCopy(glyphIDs, numGlyphs); | 1312 SkTDArray<uint16_t> glyphIDsCopy(glyphIDs, numGlyphs); |
1313 | 1313 |
1314 while (numGlyphs > consumedGlyphCount) { | 1314 while (numGlyphs > consumedGlyphCount) { |
1315 this->updateFont(textPaint, glyphIDs[consumedGlyphCount], content.entry(
)); | 1315 this->updateFont(textPaint, glyphIDs[consumedGlyphCount], content.entry(
)); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1371 ScopedContentEntry content(this, d, textPaint, true); | 1371 ScopedContentEntry content(this, d, textPaint, true); |
1372 if (!content.entry()) { | 1372 if (!content.entry()) { |
1373 return; | 1373 return; |
1374 } | 1374 } |
1375 | 1375 |
1376 SkGlyphStorage storage(0); | 1376 SkGlyphStorage storage(0); |
1377 const uint16_t* glyphIDs = nullptr; | 1377 const uint16_t* glyphIDs = nullptr; |
1378 size_t numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphID
s); | 1378 size_t numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphID
s); |
1379 textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 1379 textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
1380 | 1380 |
1381 SkDrawCacheProc glyphCacheProc = textPaint.getDrawCacheProc(); | 1381 SkPaint::GlyphCacheProc glyphCacheProc = textPaint.getGlyphCacheProc(true); |
1382 content.entry()->fContent.writeText("BT\n"); | 1382 content.entry()->fContent.writeText("BT\n"); |
1383 this->updateFont(textPaint, glyphIDs[0], content.entry()); | 1383 this->updateFont(textPaint, glyphIDs[0], content.entry()); |
1384 for (size_t i = 0; i < numGlyphs; i++) { | 1384 for (size_t i = 0; i < numGlyphs; i++) { |
1385 SkPDFFont* font = content.entry()->fState.fFont; | 1385 SkPDFFont* font = content.entry()->fState.fFont; |
1386 uint16_t encodedValue = glyphIDs[i]; | 1386 uint16_t encodedValue = glyphIDs[i]; |
1387 if (font->glyphsToPDFFontEncoding(&encodedValue, 1) != 1) { | 1387 if (font->glyphsToPDFFontEncoding(&encodedValue, 1) != 1) { |
1388 // The current pdf font cannot encode the current glyph. | 1388 // The current pdf font cannot encode the current glyph. |
1389 // Try to get a pdf font which can encode the current glyph. | 1389 // Try to get a pdf font which can encode the current glyph. |
1390 this->updateFont(textPaint, glyphIDs[i], content.entry()); | 1390 this->updateFont(textPaint, glyphIDs[i], content.entry()); |
1391 font = content.entry()->fState.fFont; | 1391 font = content.entry()->fState.fFont; |
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2365 pdfimage.reset(SkPDFCreateBitmapObject( | 2365 pdfimage.reset(SkPDFCreateBitmapObject( |
2366 image, fCanon->fPixelSerializer)); | 2366 image, fCanon->fPixelSerializer)); |
2367 if (!pdfimage) { | 2367 if (!pdfimage) { |
2368 return; | 2368 return; |
2369 } | 2369 } |
2370 fCanon->addPDFBitmap(image->uniqueID(), pdfimage); | 2370 fCanon->addPDFBitmap(image->uniqueID(), pdfimage); |
2371 } | 2371 } |
2372 SkPDFUtils::DrawFormXObject(this->addXObjectResource(pdfimage.get()), | 2372 SkPDFUtils::DrawFormXObject(this->addXObjectResource(pdfimage.get()), |
2373 &content.entry()->fContent); | 2373 &content.entry()->fContent); |
2374 } | 2374 } |
OLD | NEW |