Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(645)

Side by Side Diff: experimental/PdfViewer/SkPdfFont.cpp

Issue 18042005: isolate podofo to prepare for native parser, autogenerate PDF API during build (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « experimental/PdfViewer/SkPdfFont.h ('k') | experimental/PdfViewer/SkPdfParser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #include "SkPdfFont.h" 1 #include "SkPdfFont.h"
2 #include "SkPdfParser.h" 2 #include "SkPdfParser.h"
3 3
4 #include "SkStream.h" 4 #include "SkStream.h"
5 #include "SkTypeface.h" 5 #include "SkTypeface.h"
6 #include "SkPdfPodofoTokenizer.h"
6 7
7 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts() { 8 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts() {
8 static std::map<std::string, SkPdfStandardFontEntry> gPdfStandardFonts; 9 static std::map<std::string, SkPdfStandardFontEntry> gPdfStandardFonts;
9 10
10 // TODO (edisonn): , vs - ? what does it mean? 11 // TODO (edisonn): , vs - ? what does it mean?
11 // TODO (edisonn): MT, PS, Oblique=italic?, ... what does it mean? 12 // TODO (edisonn): MT, PS, Oblique=italic?, ... what does it mean?
12 if (gPdfStandardFonts.empty()) { 13 if (gPdfStandardFonts.empty()) {
13 gPdfStandardFonts["Arial"] = {"Arial", false, false}; 14 gPdfStandardFonts["Arial"] = {"Arial", false, false};
14 gPdfStandardFonts["Arial,Bold"] = {"Arial", true, false}; 15 gPdfStandardFonts["Arial,Bold"] = {"Arial", true, false};
15 gPdfStandardFonts["Arial,BoldItalic"] = {"Arial", true, true}; 16 gPdfStandardFonts["Arial,BoldItalic"] = {"Arial", true, true};
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 } else if (fd->has_FontFile2()) { 158 } else if (fd->has_FontFile2()) {
158 pdfStream = fd->FontFile2(); 159 pdfStream = fd->FontFile2();
159 } if (fd->has_FontFile3()) { 160 } if (fd->has_FontFile3()) {
160 pdfStream = fd->FontFile3(); 161 pdfStream = fd->FontFile3();
161 } else { 162 } else {
162 if (loadFromName) { 163 if (loadFromName) {
163 return fontFromName(fd, fd->FontName().c_str()); 164 return fontFromName(fd, fd->FontName().c_str());
164 } 165 }
165 } 166 }
166 167
167 if (!pdfStream || !pdfStream->podofo()->GetStream()) { 168 char* uncompressedStream = NULL;
168 // TODO(edisonn): report warning to be used in testing. 169 long uncompressedStreamLength = 0;
170
171 // TODO(edisonn): report warning to be used in testing.
172 if (!pdfStream ||
173 !pdfStream->GetFilteredCopy(&uncompressedStream, &uncompressedStream Length) ||
174 !uncompressedStream ||
175 !uncompressedStreamLength) {
169 return NULL; 176 return NULL;
170 } 177 }
171 178
172 char* uncompressedStream = NULL;
173 pdf_long uncompressedStreamLength = 0;
174
175 // TODO(edisonn): get rid of try/catch exceptions! We should not throw on us er data!
176 try {
177 pdfStream->podofo()->GetStream()->GetFilteredCopy(&uncompressedStream, & uncompressedStreamLength);
178 } catch (PdfError& e) {
179 // TODO(edisonn): report warning to be used in testing.
180 return NULL;
181 }
182 SkMemoryStream* skStream = new SkMemoryStream(uncompressedStream, uncompress edStreamLength); 179 SkMemoryStream* skStream = new SkMemoryStream(uncompressedStream, uncompress edStreamLength);
183 SkTypeface* face = SkTypeface::CreateFromStream(skStream); 180 SkTypeface* face = SkTypeface::CreateFromStream(skStream);
184 181
185 if (face == NULL) { 182 if (face == NULL) {
186 // TODO(edisonn): report warning to be used in testing. 183 // TODO(edisonn): report warning to be used in testing.
187 return NULL; 184 return NULL;
188 } 185 }
189 186
190 face->ref(); 187 face->ref();
191 188
192 return new SkPdfStandardFont(face); 189 return new SkPdfStandardFont(face);
193 } 190 }
194 191
195 SkPdfFont* fontFromName(SkPdfObject* obj, const char* fontName) { 192 SkPdfFont* fontFromName(SkPdfObject* obj, const char* fontName) {
196 SkTypeface* typeface = SkTypefaceFromPdfStandardFont(fontName, false, false) ; 193 SkTypeface* typeface = SkTypefaceFromPdfStandardFont(fontName, false, false) ;
197 if (typeface != NULL) { 194 if (typeface != NULL) {
198 return new SkPdfStandardFont(typeface); 195 return new SkPdfStandardFont(typeface);
199 } 196 }
200 197
201 // TODO(edisonn): perf - make a map 198 // TODO(edisonn): perf - make a map
202 for (int i = 0 ; i < obj->doc()->GetObjects().GetSize(); i++) { 199 for (int i = 0 ; i < obj->doc()->objects(); i++) {
203 PdfVecObjects& objects = (PdfVecObjects&)obj->doc()->GetObjects(); 200 const SkPdfObject* podofoFont = obj->doc()->object(i);
204 const PdfObject* podofoFont = objects[i];
205 SkPdfFontDescriptorDictionary* fd = NULL; 201 SkPdfFontDescriptorDictionary* fd = NULL;
206 202
207 if (mapFontDescriptorDictionary(*obj->doc(), *podofoFont, &fd)) { 203 if (obj->doc()->mapper()->mapFontDescriptorDictionary(podofoFont, &fd)) {
208 if (fd->has_FontName() && fd->FontName() == fontName) { 204 if (fd->has_FontName() && fd->FontName() == fontName) {
209 SkPdfFont* font = SkPdfFont::fontFromFontDescriptor(fd, false); 205 SkPdfFont* font = SkPdfFont::fontFromFontDescriptor(fd, false);
210 if (font) { 206 if (font) {
211 return font; 207 return font;
212 } else { 208 } else {
213 // failed to load font descriptor 209 // failed to load font descriptor
214 break; 210 break;
215 } 211 }
216 } 212 }
217 } 213 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 SkPdfMultiMasterFont* SkPdfFont::fontFromMultiMasterFontDictionary(SkPdfMultiMas terFontDictionary* dict) { 278 SkPdfMultiMasterFont* SkPdfFont::fontFromMultiMasterFontDictionary(SkPdfMultiMas terFontDictionary* dict) {
283 if (dict == NULL) { 279 if (dict == NULL) {
284 return NULL; // default one? 280 return NULL; // default one?
285 } 281 }
286 282
287 return new SkPdfMultiMasterFont(dict); 283 return new SkPdfMultiMasterFont(dict);
288 } 284 }
289 285
290 static int skstoi(const SkPdfString* str) { 286 static int skstoi(const SkPdfString* str) {
291 int ret = 0; 287 int ret = 0;
292 for (int i = 0 ; i < str->podofo()->GetString().GetLength(); i++) { 288 for (int i = 0 ; i < str->len(); i++) {
293 ret = (ret << 8) + ((unsigned char*)str->podofo()->GetString().GetString ())[i]; 289 ret = (ret << 8) + ((unsigned char*)str->c_str())[i];
294 } 290 }
295 return ret; 291 return ret;
296 } 292 }
297 293
298 SkPdfToUnicode::SkPdfToUnicode(const SkPdfStream* stream) { 294 SkPdfToUnicode::SkPdfToUnicode(const SkPdfStream* stream) {
299 fCMapEncoding = NULL; 295 fCMapEncoding = NULL;
300 fCMapEncodingFlag = NULL; 296 fCMapEncodingFlag = NULL;
301 297
302 if (stream) { 298 if (stream) {
303 SkPdfTokenizer tokenizer(stream); 299 SkPdfPodofoTokenizer* tokenizer = stream->doc()->tokenizerOfStream(strea m);
304 PdfToken token; 300 PdfToken token;
305 301
306 fCMapEncoding = new unsigned short[256 * 256]; 302 fCMapEncoding = new unsigned short[256 * 256];
307 fCMapEncodingFlag = new unsigned char[256 * 256]; 303 fCMapEncodingFlag = new unsigned char[256 * 256];
308 for (int i = 0 ; i < 256 * 256; i++) { 304 for (int i = 0 ; i < 256 * 256; i++) {
309 fCMapEncoding[i] = i; 305 fCMapEncoding[i] = i;
310 fCMapEncodingFlag[i] = 0; 306 fCMapEncodingFlag[i] = 0;
311 } 307 }
312 308
313 // TODO(edisonn): deal with multibyte character, or longer strings. 309 // TODO(edisonn): deal with multibyte character, or longer strings.
314 // Ritght now we deal with up 2 characters, e.g. <0020> but not longer l ike <00660066006C> 310 // Ritght now we deal with up 2 characters, e.g. <0020> but not longer l ike <00660066006C>
315 //2 beginbfrange 311 //2 beginbfrange
316 //<0000> <005E> <0020> 312 //<0000> <005E> <0020>
317 //<005F> <0061> [<00660066> <00660069> <00660066006C>] 313 //<005F> <0061> [<00660066> <00660069> <00660066006C>]
318 314
319 while (tokenizer.readToken(&token)) { 315 while (tokenizer->readToken(&token)) {
320 316
321 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg incodespacerange") == 0) { 317 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg incodespacerange") == 0) {
322 while (tokenizer.readToken(&token) && !(token.fType == kKeyword_ TokenType && strcmp(token.fKeyword, "endcodespacerange") == 0)) { 318 while (tokenizer->readToken(&token) && !(token.fType == kKeyword _TokenType && strcmp(token.fKeyword, "endcodespacerange") == 0)) {
323 // tokenizer.PutBack(token); 319 // tokenizer->PutBack(token);
324 // tokenizer.readToken(&token); 320 // tokenizer->readToken(&token);
325 // TODO(edisonn): check token type! ignore/report errors. 321 // TODO(edisonn): check token type! ignore/report errors.
326 int start = skstoi(token.fObject->asString()); 322 int start = skstoi(token.fObject->asString());
327 tokenizer.readToken(&token); 323 tokenizer->readToken(&token);
328 int end = skstoi(token.fObject->asString()); 324 int end = skstoi(token.fObject->asString());
329 for (int i = start; i <= end; i++) { 325 for (int i = start; i <= end; i++) {
330 fCMapEncodingFlag[i] |= 1; 326 fCMapEncodingFlag[i] |= 1;
331 } 327 }
332 } 328 }
333 } 329 }
334 330
335 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg inbfchar") == 0) { 331 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg inbfchar") == 0) {
336 while (tokenizer.readToken(&token) && !(token.fType == kKeyword_ TokenType && strcmp(token.fKeyword, "endbfchar") == 0)) { 332 while (tokenizer->readToken(&token) && !(token.fType == kKeyword _TokenType && strcmp(token.fKeyword, "endbfchar") == 0)) {
337 // tokenizer.PutBack(token); 333 // tokenizer->PutBack(token);
338 // tokenizer.readToken(&token); 334 // tokenizer->readToken(&token);
339 int from = skstoi(token.fObject->asString()); 335 int from = skstoi(token.fObject->asString());
340 tokenizer.readToken(&token); 336 tokenizer->readToken(&token);
341 int to = skstoi(token.fObject->asString()); 337 int to = skstoi(token.fObject->asString());
342 338
343 fCMapEncodingFlag[from] |= 2; 339 fCMapEncodingFlag[from] |= 2;
344 fCMapEncoding[from] = to; 340 fCMapEncoding[from] = to;
345 } 341 }
346 } 342 }
347 343
348 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg inbfrange") == 0) { 344 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg inbfrange") == 0) {
349 while (tokenizer.readToken(&token) && !(token.fType == kKeyword_ TokenType && strcmp(token.fKeyword, "endbfrange") == 0)) { 345 while (tokenizer->readToken(&token) && !(token.fType == kKeyword _TokenType && strcmp(token.fKeyword, "endbfrange") == 0)) {
350 // tokenizer.PutBack(token); 346 // tokenizer->PutBack(token);
351 // tokenizer.readToken(&token); 347 // tokenizer->readToken(&token);
352 int start = skstoi(token.fObject->asString()); 348 int start = skstoi(token.fObject->asString());
353 tokenizer.readToken(&token); 349 tokenizer->readToken(&token);
354 int end = skstoi(token.fObject->asString()); 350 int end = skstoi(token.fObject->asString());
355 351
356 352
357 tokenizer.readToken(&token); // [ or just an array directly? 353 tokenizer->readToken(&token); // [ or just an array directly ?
358 // tokenizer.PutBack(token); 354 // tokenizer->PutBack(token);
359 355
360 if (token.fType == kObject_TokenType && token.fObject->asStr ing()) { 356 if (token.fType == kObject_TokenType && token.fObject->asStr ing()) {
361 // tokenizer.readToken(&token); 357 // tokenizer->readToken(&token);
362 int value = skstoi(token.fObject->asString()); 358 int value = skstoi(token.fObject->asString());
363 359
364 for (int i = start; i <= end; i++) { 360 for (int i = start; i <= end; i++) {
365 fCMapEncodingFlag[i] |= 2; 361 fCMapEncodingFlag[i] |= 2;
366 fCMapEncoding[i] = value; 362 fCMapEncoding[i] = value;
367 value++; 363 value++;
368 // if i != end, verify last byte id not if, ignore/r eport error 364 // if i != end, verify last byte id not if, ignore/r eport error
369 } 365 }
370 366
371 // read one string 367 // read one string
372 } else if (token.fType == kObject_TokenType && token.fObject ->asArray()) { 368 } else if (token.fType == kObject_TokenType && token.fObject ->asArray()) {
373 // tokenizer.readToken(&token); 369 // tokenizer->readToken(&token);
374 for (int i = 0; i < token.fObject->asArray()->size(); i+ +) { 370 for (int i = 0; i < token.fObject->asArray()->size(); i+ +) {
375 fCMapEncodingFlag[start + i] |= 2; 371 fCMapEncodingFlag[start + i] |= 2;
376 fCMapEncoding[start + i] = skstoi((*token.fObject->a sArray())[i]->asString()); 372 fCMapEncoding[start + i] = skstoi((*token.fObject->a sArray())[i]->asString());
377 } 373 }
378 // read array 374 // read array
379 } 375 }
380 376
381 //fCMapEncodingFlag[from] = 1; 377 //fCMapEncodingFlag[from] = 1;
382 //fCMapEncoding[from] = to; 378 //fCMapEncoding[from] = to;
383 } 379 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 SkPdfEncoding* SkPdfEncoding::fromName(const char* name) { 415 SkPdfEncoding* SkPdfEncoding::fromName(const char* name) {
420 SkPdfEncoding* encoding = getStandardEncodings()[name]; 416 SkPdfEncoding* encoding = getStandardEncodings()[name];
421 417
422 #ifdef PDF_TRACE 418 #ifdef PDF_TRACE
423 if (encoding == NULL) { 419 if (encoding == NULL) {
424 printf("Encoding not found: %s\n", name); 420 printf("Encoding not found: %s\n", name);
425 } 421 }
426 #endif 422 #endif
427 return encoding; 423 return encoding;
428 } 424 }
OLDNEW
« no previous file with comments | « experimental/PdfViewer/SkPdfFont.h ('k') | experimental/PdfViewer/SkPdfParser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698