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 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1044 if (d.fClip->isEmpty()) { | 1044 if (d.fClip->isEmpty()) { |
1045 return; | 1045 return; |
1046 } | 1046 } |
1047 | 1047 |
1048 SkMatrix matrix; | 1048 SkMatrix matrix; |
1049 matrix.setTranslate(SkIntToScalar(x), SkIntToScalar(y)); | 1049 matrix.setTranslate(SkIntToScalar(x), SkIntToScalar(y)); |
1050 this->internalDrawBitmap(matrix, d.fClipStack, *d.fClip, bitmap, NULL, | 1050 this->internalDrawBitmap(matrix, d.fClipStack, *d.fClip, bitmap, NULL, |
1051 paint); | 1051 paint); |
1052 } | 1052 } |
1053 | 1053 |
1054 // Create a PDF string. Maximum length (in bytes) is 65,535. | |
1055 // @param value A string value. | |
tomhudson
2015/04/07 15:08:23
This parameter is now named 'input', not 'value'.
hal.canary
2015/04/07 17:32:57
Done.
| |
1056 // @param len The length of value. | |
1057 // @param wideChars Indicates if the top byte in value is significant and | |
tomhudson
2015/04/07 15:08:23
Is the 'top' byte the first byte? If this is only
hal.canary
2015/04/07 17:32:57
Done.
| |
1058 // should be encoded (true) or not (false). | |
tomhudson
2015/04/07 15:08:23
Nit: other comments need name of 'input' fixed.
hal.canary
2015/04/07 17:32:57
Done.
| |
1059 static SkString format_wide_string(const uint16_t* input, | |
1060 size_t len, | |
1061 bool wideChars) { | |
1062 SkASSERT(len <= 65535); | |
1063 if (wideChars) { | |
1064 static const char gHex[] = "0123456789ABCDEF"; | |
1065 SkString result(4 * len + 2); | |
1066 result[0] = '<'; | |
1067 for (size_t i = 0; i < len; i++) { | |
1068 result[4 * i + 1] = gHex[(input[i] >> 12) & 0xF]; | |
1069 result[4 * i + 2] = gHex[(input[i] >> 8) & 0xF]; | |
1070 result[4 * i + 3] = gHex[(input[i] >> 4) & 0xF]; | |
1071 result[4 * i + 4] = gHex[(input[i] ) & 0xF]; | |
1072 } | |
1073 result[4 * len + 1] = '>'; | |
1074 return result; | |
1075 } else { | |
1076 SkString tmp(len); | |
1077 for (size_t i = 0; i < len; i++) { | |
1078 SkASSERT(0 == input[i] >> 8); | |
1079 tmp[i] = static_cast<uint8_t>(input[i]); | |
1080 } | |
1081 return SkPDFString::FormatString(tmp.c_str(), tmp.size()); | |
1082 } | |
1083 } | |
1084 | |
1054 void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, | 1085 void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
1055 SkScalar x, SkScalar y, const SkPaint& paint) { | 1086 SkScalar x, SkScalar y, const SkPaint& paint) { |
1056 NOT_IMPLEMENTED(paint.getMaskFilter() != NULL, false); | 1087 NOT_IMPLEMENTED(paint.getMaskFilter() != NULL, false); |
1057 if (paint.getMaskFilter() != NULL) { | 1088 if (paint.getMaskFilter() != NULL) { |
1058 // Don't pretend we support drawing MaskFilters, it makes for artifacts | 1089 // Don't pretend we support drawing MaskFilters, it makes for artifacts |
1059 // making text unreadable (e.g. same text twice when using CSS shadows). | 1090 // making text unreadable (e.g. same text twice when using CSS shadows). |
1060 return; | 1091 return; |
1061 } | 1092 } |
1062 SkPaint textPaint = calculate_text_paint(paint); | 1093 SkPaint textPaint = calculate_text_paint(paint); |
1063 ScopedContentEntry content(this, d, textPaint, true); | 1094 ScopedContentEntry content(this, d, textPaint, true); |
(...skipping 19 matching lines...) Expand all Loading... | |
1083 updateFont(textPaint, glyphIDs[consumedGlyphCount], content.entry()); | 1114 updateFont(textPaint, glyphIDs[consumedGlyphCount], content.entry()); |
1084 SkPDFFont* font = content.entry()->fState.fFont; | 1115 SkPDFFont* font = content.entry()->fState.fFont; |
1085 | 1116 |
1086 int availableGlyphs = font->glyphsToPDFFontEncoding( | 1117 int availableGlyphs = font->glyphsToPDFFontEncoding( |
1087 glyphIDsCopy.begin() + consumedGlyphCount, | 1118 glyphIDsCopy.begin() + consumedGlyphCount, |
1088 numGlyphs - consumedGlyphCount); | 1119 numGlyphs - consumedGlyphCount); |
1089 fFontGlyphUsage->noteGlyphUsage( | 1120 fFontGlyphUsage->noteGlyphUsage( |
1090 font, glyphIDsCopy.begin() + consumedGlyphCount, | 1121 font, glyphIDsCopy.begin() + consumedGlyphCount, |
1091 availableGlyphs); | 1122 availableGlyphs); |
1092 SkString encodedString = | 1123 SkString encodedString = |
1093 SkPDFString::FormatString(glyphIDsCopy.begin() + consumedGlyphCount, | 1124 format_wide_string(glyphIDsCopy.begin() + consumedGlyphCount, |
1094 availableGlyphs, font->multiByteGlyphs()); | 1125 availableGlyphs, font->multiByteGlyphs()); |
1095 content.entry()->fContent.writeText(encodedString.c_str()); | 1126 content.entry()->fContent.writeText(encodedString.c_str()); |
1096 consumedGlyphCount += availableGlyphs; | 1127 consumedGlyphCount += availableGlyphs; |
1097 content.entry()->fContent.writeText(" Tj\n"); | 1128 content.entry()->fContent.writeText(" Tj\n"); |
1098 } | 1129 } |
1099 content.entry()->fContent.writeText("ET\n"); | 1130 content.entry()->fContent.writeText("ET\n"); |
1100 } | 1131 } |
1101 | 1132 |
1102 void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, | 1133 void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, |
1103 const SkScalar pos[], int scalarsPerPos, | 1134 const SkScalar pos[], int scalarsPerPos, |
1104 const SkPoint& offset, const SkPaint& paint) { | 1135 const SkPoint& offset, const SkPaint& paint) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1137 } | 1168 } |
1138 } | 1169 } |
1139 | 1170 |
1140 fFontGlyphUsage->noteGlyphUsage(font, &encodedValue, 1); | 1171 fFontGlyphUsage->noteGlyphUsage(font, &encodedValue, 1); |
1141 SkScalar x = offset.x() + pos[i * scalarsPerPos]; | 1172 SkScalar x = offset.x() + pos[i * scalarsPerPos]; |
1142 SkScalar y = offset.y() + (2 == scalarsPerPos ? pos[i * scalarsPerPos + 1] : 0); | 1173 SkScalar y = offset.y() + (2 == scalarsPerPos ? pos[i * scalarsPerPos + 1] : 0); |
1143 | 1174 |
1144 align_text(glyphCacheProc, textPaint, glyphIDs + i, 1, &x, &y); | 1175 align_text(glyphCacheProc, textPaint, glyphIDs + i, 1, &x, &y); |
1145 set_text_transform(x, y, textPaint.getTextSkewX(), &content.entry()->fCo ntent); | 1176 set_text_transform(x, y, textPaint.getTextSkewX(), &content.entry()->fCo ntent); |
1146 SkString encodedString = | 1177 SkString encodedString = |
1147 SkPDFString::FormatString(&encodedValue, 1, font->multiByteGlyphs()) ; | 1178 format_wide_string(&encodedValue, 1, font->multiByteGlyphs()); |
1148 content.entry()->fContent.writeText(encodedString.c_str()); | 1179 content.entry()->fContent.writeText(encodedString.c_str()); |
1149 content.entry()->fContent.writeText(" Tj\n"); | 1180 content.entry()->fContent.writeText(" Tj\n"); |
1150 } | 1181 } |
1151 content.entry()->fContent.writeText("ET\n"); | 1182 content.entry()->fContent.writeText("ET\n"); |
1152 } | 1183 } |
1153 | 1184 |
1154 void SkPDFDevice::drawVertices(const SkDraw& d, SkCanvas::VertexMode, | 1185 void SkPDFDevice::drawVertices(const SkDraw& d, SkCanvas::VertexMode, |
1155 int vertexCount, const SkPoint verts[], | 1186 int vertexCount, const SkPoint verts[], |
1156 const SkPoint texs[], const SkColor colors[], | 1187 const SkPoint texs[], const SkColor colors[], |
1157 SkXfermode* xmode, const uint16_t indices[], | 1188 SkXfermode* xmode, const uint16_t indices[], |
(...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2132 return; | 2163 return; |
2133 } | 2164 } |
2134 SkAutoTUnref<SkPDFObject> image(SkPDFBitmap::Create(fCanon, subsetBitmap)); | 2165 SkAutoTUnref<SkPDFObject> image(SkPDFBitmap::Create(fCanon, subsetBitmap)); |
2135 if (!image) { | 2166 if (!image) { |
2136 return; | 2167 return; |
2137 } | 2168 } |
2138 | 2169 |
2139 SkPDFUtils::DrawFormXObject(this->addXObjectResource(image.get()), | 2170 SkPDFUtils::DrawFormXObject(this->addXObjectResource(image.get()), |
2140 &content.entry()->fContent); | 2171 &content.entry()->fContent); |
2141 } | 2172 } |
OLD | NEW |