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

Side by Side Diff: src/pdf/SkPDFUtils.cpp

Issue 2099463002: SkPDF: alloc less memory for strings (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2016-06-23 (Thursday) 16:23:34 EDT Created 4 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
OLDNEW
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 8
9 #include "SkData.h" 9 #include "SkData.h"
10 #include "SkGeometry.h" 10 #include "SkGeometry.h"
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 // When significantDigits == maxSignificantDigits, we can stop. 363 // When significantDigits == maxSignificantDigits, we can stop.
364 // when output == end, we have filed the string. 364 // when output == end, we have filed the string.
365 // Note: denormalized numbers will not have the same number of 365 // Note: denormalized numbers will not have the same number of
366 // significantDigits, but do not need them to round-trip. 366 // significantDigits, but do not need them to round-trip.
367 } 367 }
368 SkASSERT(output <= end); 368 SkASSERT(output <= end);
369 *output = '\0'; 369 *output = '\0';
370 return output - result; 370 return output - result;
371 } 371 }
372 372
373 SkString SkPDFUtils::FormatString(const char* cin, size_t len) { 373 void SkPDFUtils::WriteString(SkWStream* wStream, const char* cin, size_t len) {
374 SkDEBUGCODE(static const size_t kMaxLen = 65535;) 374 SkDEBUGCODE(static const size_t kMaxLen = 65535;)
375 SkASSERT(len <= kMaxLen); 375 SkASSERT(len <= kMaxLen);
376 376
377 // 7-bit clean is a heuristic to decide what string format to use; 377 size_t extraCharacterCount = 0;
378 // a 7-bit clean string should require little escaping.
379 bool sevenBitClean = true;
380 size_t characterCount = 2 + len;
381 for (size_t i = 0; i < len; i++) { 378 for (size_t i = 0; i < len; i++) {
382 if (cin[i] > '~' || cin[i] < ' ') { 379 if (cin[i] > '~' || cin[i] < ' ') {
383 sevenBitClean = false; 380 extraCharacterCount += 3;
384 break;
385 } 381 }
386 if (cin[i] == '\\' || cin[i] == '(' || cin[i] == ')') { 382 if (cin[i] == '\\' || cin[i] == '(' || cin[i] == ')') {
387 ++characterCount; 383 ++extraCharacterCount;
388 } 384 }
389 } 385 }
390 SkString result; 386 if (extraCharacterCount <= len) {
391 if (sevenBitClean) { 387 wStream->writeText("(");
392 result.resize(characterCount);
393 char* str = result.writable_str();
394 *str++ = '(';
395 for (size_t i = 0; i < len; i++) { 388 for (size_t i = 0; i < len; i++) {
396 if (cin[i] == '\\' || cin[i] == '(' || cin[i] == ')') { 389 if (cin[i] > '~' || cin[i] < ' ') {
397 *str++ = '\\'; 390 uint8_t c = static_cast<uint8_t>(cin[i]);
391 uint8_t octal[4];
392 octal[0] = '\\';
393 octal[1] = '0' + ( c >> 6 );
394 octal[2] = '0' + ((c >> 3) & 0x07);
395 octal[3] = '0' + ( c & 0x07);
396 wStream->write(octal, 4);
397 } else {
398 if (cin[i] == '\\' || cin[i] == '(' || cin[i] == ')') {
399 wStream->writeText("\\");
400 }
401 wStream->write(&cin[i], 1);
398 } 402 }
399 *str++ = cin[i];
400 } 403 }
401 *str++ = ')'; 404 wStream->writeText(")");
402 } else { 405 } else {
403 result.resize(2 * len + 2); 406 wStream->writeText("<");
404 char* str = result.writable_str();
405 *str++ = '<';
406 for (size_t i = 0; i < len; i++) { 407 for (size_t i = 0; i < len; i++) {
407 uint8_t c = static_cast<uint8_t>(cin[i]); 408 uint8_t c = static_cast<uint8_t>(cin[i]);
408 static const char gHex[] = "0123456789ABCDEF"; 409 static const char gHex[] = "0123456789ABCDEF";
409 *str++ = gHex[(c >> 4) & 0xF]; 410 char hexValue[2];
410 *str++ = gHex[(c ) & 0xF]; 411 hexValue[0] = gHex[(c >> 4) & 0xF];
412 hexValue[1] = gHex[ c & 0xF];
413 wStream->write(hexValue, 2);
411 } 414 }
412 *str++ = '>'; 415 wStream->writeText(">");
413 } 416 }
414 return result;
415 } 417 }
OLDNEW
« src/pdf/SkPDFDevice.cpp ('K') | « src/pdf/SkPDFUtils.h ('k') | tests/PDFPrimitivesTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698