OLD | NEW |
| 1 |
1 /* | 2 /* |
2 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
3 * | 4 * |
4 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 6 * found in the LICENSE file. |
6 */ | 7 */ |
7 | 8 |
8 #include "SkDeflate.h" | 9 #include "SkDeflate.h" |
9 #include "SkPDFTypes.h" | 10 #include "SkPDFTypes.h" |
10 #include "SkPDFUtils.h" | 11 #include "SkPDFUtils.h" |
11 #include "SkStreamPriv.h" | 12 #include "SkStreamPriv.h" |
12 | 13 |
13 //////////////////////////////////////////////////////////////////////////////// | 14 //////////////////////////////////////////////////////////////////////////////// |
14 | 15 |
15 SkString* pun(char* x) { return reinterpret_cast<SkString*>(x); } | 16 SkString* pun(char* x) { return reinterpret_cast<SkString*>(x); } |
16 const SkString* pun(const char* x) { | 17 const SkString* pun(const char* x) { |
17 return reinterpret_cast<const SkString*>(x); | 18 return reinterpret_cast<const SkString*>(x); |
18 } | 19 } |
19 | 20 |
20 SkPDFUnion::SkPDFUnion(Type t) : fType(t) {} | 21 SkPDFUnion::SkPDFUnion(Type t) : fType(t) {} |
21 | 22 |
22 SkPDFUnion::~SkPDFUnion() { | 23 SkPDFUnion::~SkPDFUnion() { |
23 switch (fType) { | 24 switch (fType) { |
24 case Type::kNameSkS: | 25 case Type::kNameSkS: |
25 case Type::kStringSkS: | 26 case Type::kStringSkS: |
26 pun(fSkString)->~SkString(); | 27 pun(fSkString)->~SkString(); |
27 return; | 28 return; |
28 case Type::kObjRef: | 29 case Type::kObjRef: |
29 case Type::kObject: | 30 case Type::kObject: |
30 SkASSERT(fObject); | 31 SkSafeUnref(fObject); |
31 fObject->unref(); | |
32 return; | 32 return; |
33 default: | 33 default: |
34 return; | 34 return; |
35 } | 35 } |
36 } | 36 } |
37 | 37 |
38 SkPDFUnion& SkPDFUnion::operator=(SkPDFUnion&& other) { | 38 SkPDFUnion& SkPDFUnion::operator=(SkPDFUnion&& other) { |
39 if (this != &other) { | 39 if (this != &other) { |
40 this->~SkPDFUnion(); | 40 this->~SkPDFUnion(); |
41 new (this) SkPDFUnion(std::move(other)); | 41 new (this) SkPDFUnion(other.move()); |
42 } | 42 } |
43 return *this; | 43 return *this; |
44 } | 44 } |
45 | 45 |
46 SkPDFUnion::SkPDFUnion(SkPDFUnion&& other) { | 46 SkPDFUnion::SkPDFUnion(SkPDFUnion&& other) { |
47 SkASSERT(this != &other); | 47 SkASSERT(this != &other); |
48 memcpy(this, &other, sizeof(*this)); | 48 memcpy(this, &other, sizeof(*this)); |
49 other.fType = Type::kDestroyed; | 49 other.fType = Type::kDestroyed; |
50 } | 50 } |
51 | 51 |
52 #if 0 | 52 #if 0 |
53 SkPDFUnion SkPDFUnion::copy() const { | 53 SkPDFUnion SkPDFUnion::copy() const { |
54 SkPDFUnion u(fType); | 54 SkPDFUnion u(fType); |
55 memcpy(&u, this, sizeof(u)); | 55 memcpy(&u, this, sizeof(u)); |
56 switch (fType) { | 56 switch (fType) { |
57 case Type::kNameSkS: | 57 case Type::kNameSkS: |
58 case Type::kStringSkS: | 58 case Type::kStringSkS: |
59 new (pun(u.fSkString)) SkString(*pun(fSkString)); | 59 new (pun(u.fSkString)) SkString (
*pun(fSkString)); |
60 return std::move(u); | 60 return u.move(); |
61 case Type::kObjRef: | 61 case Type::kObjRef: |
62 case Type::kObject: | 62 case Type::kObject: |
63 SkRef(u.fObject); | 63 SkRef(u.fObject); |
64 return std::move(u); | 64 return u.move(); |
65 default: | 65 default: |
66 return std::move(u); | 66 return u.move(); |
67 } | 67 } |
68 } | 68 } |
69 SkPDFUnion& SkPDFUnion::operator=(const SkPDFUnion& other) { | 69 SkPDFUnion& SkPDFUnion::operator=(const SkPDFUnion& other) { |
70 return *this = other.copy(); | 70 return *this = other.copy(); |
71 } | 71 } |
72 SkPDFUnion::SkPDFUnion(const SkPDFUnion& other) { | 72 SkPDFUnion::SkPDFUnion(const SkPDFUnion& other) { |
73 *this = other.copy(); | 73 *this = other.copy(); |
74 } | 74 } |
75 #endif | 75 #endif |
76 | 76 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 fObject->addResources(objNumMap, substituteMap); | 184 fObject->addResources(objNumMap, substituteMap); |
185 return; | 185 return; |
186 default: | 186 default: |
187 SkDEBUGFAIL("SkPDFUnion::addResources with bad type"); | 187 SkDEBUGFAIL("SkPDFUnion::addResources with bad type"); |
188 } | 188 } |
189 } | 189 } |
190 | 190 |
191 SkPDFUnion SkPDFUnion::Int(int32_t value) { | 191 SkPDFUnion SkPDFUnion::Int(int32_t value) { |
192 SkPDFUnion u(Type::kInt); | 192 SkPDFUnion u(Type::kInt); |
193 u.fIntValue = value; | 193 u.fIntValue = value; |
194 return std::move(u); | 194 return u.move(); |
195 } | 195 } |
196 | 196 |
197 SkPDFUnion SkPDFUnion::Bool(bool value) { | 197 SkPDFUnion SkPDFUnion::Bool(bool value) { |
198 SkPDFUnion u(Type::kBool); | 198 SkPDFUnion u(Type::kBool); |
199 u.fBoolValue = value; | 199 u.fBoolValue = value; |
200 return std::move(u); | 200 return u.move(); |
201 } | 201 } |
202 | 202 |
203 SkPDFUnion SkPDFUnion::Scalar(SkScalar value) { | 203 SkPDFUnion SkPDFUnion::Scalar(SkScalar value) { |
204 SkPDFUnion u(Type::kScalar); | 204 SkPDFUnion u(Type::kScalar); |
205 u.fScalarValue = value; | 205 u.fScalarValue = value; |
206 return std::move(u); | 206 return u.move(); |
207 } | 207 } |
208 | 208 |
209 SkPDFUnion SkPDFUnion::Name(const char* value) { | 209 SkPDFUnion SkPDFUnion::Name(const char* value) { |
210 SkPDFUnion u(Type::kName); | 210 SkPDFUnion u(Type::kName); |
211 SkASSERT(value); | 211 SkASSERT(value); |
212 SkASSERT(is_valid_name(value)); | 212 SkASSERT(is_valid_name(value)); |
213 u.fStaticString = value; | 213 u.fStaticString = value; |
214 return std::move(u); | 214 return u.move(); |
215 } | 215 } |
216 | 216 |
217 SkPDFUnion SkPDFUnion::String(const char* value) { | 217 SkPDFUnion SkPDFUnion::String(const char* value) { |
218 SkPDFUnion u(Type::kString); | 218 SkPDFUnion u(Type::kString); |
219 SkASSERT(value); | 219 SkASSERT(value); |
220 u.fStaticString = value; | 220 u.fStaticString = value; |
221 return std::move(u); | 221 return u.move(); |
222 } | 222 } |
223 | 223 |
224 SkPDFUnion SkPDFUnion::Name(const SkString& s) { | 224 SkPDFUnion SkPDFUnion::Name(const SkString& s) { |
225 SkPDFUnion u(Type::kNameSkS); | 225 SkPDFUnion u(Type::kNameSkS); |
226 new (pun(u.fSkString)) SkString(s); | 226 new (pun(u.fSkString)) SkString(s); |
227 return std::move(u); | 227 return u.move(); |
228 } | 228 } |
229 | 229 |
230 SkPDFUnion SkPDFUnion::String(const SkString& s) { | 230 SkPDFUnion SkPDFUnion::String(const SkString& s) { |
231 SkPDFUnion u(Type::kStringSkS); | 231 SkPDFUnion u(Type::kStringSkS); |
232 new (pun(u.fSkString)) SkString(s); | 232 new (pun(u.fSkString)) SkString(s); |
233 return std::move(u); | 233 return u.move(); |
234 } | 234 } |
235 | 235 |
236 SkPDFUnion SkPDFUnion::ObjRef(sk_sp<SkPDFObject> objSp) { | 236 SkPDFUnion SkPDFUnion::ObjRef(SkPDFObject* ptr) { |
237 SkPDFUnion u(Type::kObjRef); | 237 SkPDFUnion u(Type::kObjRef); |
238 SkASSERT(objSp.get()); | 238 SkASSERT(ptr); |
239 u.fObject = objSp.release(); // take ownership into union{} | 239 u.fObject = ptr; |
240 return std::move(u); | 240 return u.move(); |
241 } | 241 } |
242 | 242 |
243 SkPDFUnion SkPDFUnion::Object(sk_sp<SkPDFObject> objSp) { | 243 SkPDFUnion SkPDFUnion::Object(SkPDFObject* ptr) { |
244 SkPDFUnion u(Type::kObject); | 244 SkPDFUnion u(Type::kObject); |
245 SkASSERT(objSp.get()); | 245 SkASSERT(ptr); |
246 u.fObject = objSp.release(); // take ownership into union{} | 246 u.fObject = ptr; |
247 return std::move(u); | 247 return u.move(); |
248 } | 248 } |
249 | 249 |
250 //////////////////////////////////////////////////////////////////////////////// | 250 //////////////////////////////////////////////////////////////////////////////// |
251 | 251 |
252 #if 0 // Enable if needed. | 252 #if 0 // Enable if needed. |
253 void SkPDFAtom::emitObject(SkWStream* stream, | 253 void SkPDFAtom::emitObject(SkWStream* stream, |
254 const SkPDFObjNumMap& objNumMap, | 254 const SkPDFObjNumMap& objNumMap, |
255 const SkPDFSubstituteMap& substitutes) const { | 255 const SkPDFSubstituteMap& substitutes) const { |
256 fValue.emitObject(stream, objNumMap, substitutes); | 256 fValue.emitObject(stream, objNumMap, substitutes); |
257 } | 257 } |
(...skipping 30 matching lines...) Expand all Loading... |
288 stream->writeText("]"); | 288 stream->writeText("]"); |
289 } | 289 } |
290 | 290 |
291 void SkPDFArray::addResources(SkPDFObjNumMap* catalog, | 291 void SkPDFArray::addResources(SkPDFObjNumMap* catalog, |
292 const SkPDFSubstituteMap& substitutes) const { | 292 const SkPDFSubstituteMap& substitutes) const { |
293 for (const SkPDFUnion& value : fValues) { | 293 for (const SkPDFUnion& value : fValues) { |
294 value.addResources(catalog, substitutes); | 294 value.addResources(catalog, substitutes); |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 void SkPDFArray::append(SkPDFUnion&& value) { | 298 void SkPDFArray::append(SkPDFUnion&& value) { new (fValues.append()) SkPDFUnion(
value.move()); } |
299 new (fValues.append()) SkPDFUnion(std::move(value)); | |
300 } | |
301 | 299 |
302 void SkPDFArray::appendInt(int32_t value) { | 300 void SkPDFArray::appendInt(int32_t value) { |
303 this->append(SkPDFUnion::Int(value)); | 301 this->append(SkPDFUnion::Int(value)); |
304 } | 302 } |
305 | 303 |
306 void SkPDFArray::appendBool(bool value) { | 304 void SkPDFArray::appendBool(bool value) { |
307 this->append(SkPDFUnion::Bool(value)); | 305 this->append(SkPDFUnion::Bool(value)); |
308 } | 306 } |
309 | 307 |
310 void SkPDFArray::appendScalar(SkScalar value) { | 308 void SkPDFArray::appendScalar(SkScalar value) { |
311 this->append(SkPDFUnion::Scalar(value)); | 309 this->append(SkPDFUnion::Scalar(value)); |
312 } | 310 } |
313 | 311 |
314 void SkPDFArray::appendName(const char name[]) { | 312 void SkPDFArray::appendName(const char name[]) { |
315 this->append(SkPDFUnion::Name(SkString(name))); | 313 this->append(SkPDFUnion::Name(SkString(name))); |
316 } | 314 } |
317 | 315 |
318 void SkPDFArray::appendName(const SkString& name) { | 316 void SkPDFArray::appendName(const SkString& name) { |
319 this->append(SkPDFUnion::Name(name)); | 317 this->append(SkPDFUnion::Name(name)); |
320 } | 318 } |
321 | 319 |
322 void SkPDFArray::appendString(const SkString& value) { | 320 void SkPDFArray::appendString(const SkString& value) { |
323 this->append(SkPDFUnion::String(value)); | 321 this->append(SkPDFUnion::String(value)); |
324 } | 322 } |
325 | 323 |
326 void SkPDFArray::appendString(const char value[]) { | 324 void SkPDFArray::appendString(const char value[]) { |
327 this->append(SkPDFUnion::String(value)); | 325 this->append(SkPDFUnion::String(value)); |
328 } | 326 } |
329 | 327 |
330 void SkPDFArray::appendObject(sk_sp<SkPDFObject> objSp) { | 328 void SkPDFArray::appendObject(SkPDFObject* value) { |
331 this->append(SkPDFUnion::Object(std::move(objSp))); | 329 this->append(SkPDFUnion::Object(value)); |
332 } | 330 } |
333 | 331 |
334 void SkPDFArray::appendObjRef(sk_sp<SkPDFObject> objSp) { | 332 void SkPDFArray::appendObjRef(SkPDFObject* value) { |
335 this->append(SkPDFUnion::ObjRef(std::move(objSp))); | 333 this->append(SkPDFUnion::ObjRef(value)); |
336 } | 334 } |
337 | 335 |
338 /////////////////////////////////////////////////////////////////////////////// | 336 /////////////////////////////////////////////////////////////////////////////// |
339 | 337 |
340 SkPDFDict::SkPDFDict() {} | 338 SkPDFDict::SkPDFDict() {} |
341 | 339 |
342 SkPDFDict::~SkPDFDict() { this->clear(); } | 340 SkPDFDict::~SkPDFDict() { this->clear(); } |
343 | 341 |
344 SkPDFDict::SkPDFDict(const char type[]) { this->insertName("Type", type); } | 342 SkPDFDict::SkPDFDict(const char type[]) { this->insertName("Type", type); } |
345 | 343 |
(...skipping 22 matching lines...) Expand all Loading... |
368 const SkPDFSubstituteMap& substitutes) const { | 366 const SkPDFSubstituteMap& substitutes) const { |
369 for (int i = 0; i < fRecords.count(); i++) { | 367 for (int i = 0; i < fRecords.count(); i++) { |
370 fRecords[i].fKey.addResources(catalog, substitutes); | 368 fRecords[i].fKey.addResources(catalog, substitutes); |
371 fRecords[i].fValue.addResources(catalog, substitutes); | 369 fRecords[i].fValue.addResources(catalog, substitutes); |
372 } | 370 } |
373 } | 371 } |
374 | 372 |
375 void SkPDFDict::set(SkPDFUnion&& name, SkPDFUnion&& value) { | 373 void SkPDFDict::set(SkPDFUnion&& name, SkPDFUnion&& value) { |
376 Record* rec = fRecords.append(); | 374 Record* rec = fRecords.append(); |
377 SkASSERT(name.isName()); | 375 SkASSERT(name.isName()); |
378 new (&rec->fKey) SkPDFUnion(std::move(name)); | 376 new (&rec->fKey) SkPDFUnion(name.move()); |
379 new (&rec->fValue) SkPDFUnion(std::move(value)); | 377 new (&rec->fValue) SkPDFUnion(value.move()); |
380 } | 378 } |
381 | 379 |
382 int SkPDFDict::size() const { return fRecords.count(); } | 380 int SkPDFDict::size() const { return fRecords.count(); } |
383 | 381 |
384 void SkPDFDict::insertObjRef(const char key[], sk_sp<SkPDFObject> objSp) { | 382 void SkPDFDict::insertObjRef(const char key[], SkPDFObject* value) { |
385 this->set(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(std::move(objSp))); | 383 this->set(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(value)); |
386 } | 384 } |
387 void SkPDFDict::insertObjRef(const SkString& key, sk_sp<SkPDFObject> objSp) { | 385 void SkPDFDict::insertObjRef(const SkString& key, SkPDFObject* value) { |
388 this->set(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(std::move(objSp))); | 386 this->set(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(value)); |
389 } | 387 } |
390 | 388 |
391 void SkPDFDict::insertObject(const char key[], sk_sp<SkPDFObject> objSp) { | 389 void SkPDFDict::insertObject(const char key[], SkPDFObject* value) { |
392 this->set(SkPDFUnion::Name(key), SkPDFUnion::Object(std::move(objSp))); | 390 this->set(SkPDFUnion::Name(key), SkPDFUnion::Object(value)); |
393 } | 391 } |
394 void SkPDFDict::insertObject(const SkString& key, sk_sp<SkPDFObject> objSp) { | 392 void SkPDFDict::insertObject(const SkString& key, SkPDFObject* value) { |
395 this->set(SkPDFUnion::Name(key), SkPDFUnion::Object(std::move(objSp))); | 393 this->set(SkPDFUnion::Name(key), SkPDFUnion::Object(value)); |
396 } | 394 } |
397 | 395 |
398 void SkPDFDict::insertBool(const char key[], bool value) { | 396 void SkPDFDict::insertBool(const char key[], bool value) { |
399 this->set(SkPDFUnion::Name(key), SkPDFUnion::Bool(value)); | 397 this->set(SkPDFUnion::Name(key), SkPDFUnion::Bool(value)); |
400 } | 398 } |
401 | 399 |
402 void SkPDFDict::insertInt(const char key[], int32_t value) { | 400 void SkPDFDict::insertInt(const char key[], int32_t value) { |
403 this->set(SkPDFUnion::Name(key), SkPDFUnion::Int(value)); | 401 this->set(SkPDFUnion::Name(key), SkPDFUnion::Int(value)); |
404 } | 402 } |
405 | 403 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 | 518 |
521 void SkPDFImageDumpStats() { | 519 void SkPDFImageDumpStats() { |
522 SkDebugf("\ntotal PDF drawImage/drawBitmap calls: %d\n" | 520 SkDebugf("\ntotal PDF drawImage/drawBitmap calls: %d\n" |
523 "total PDF jpeg images: %d\n" | 521 "total PDF jpeg images: %d\n" |
524 "total PDF regular images: %d\n", | 522 "total PDF regular images: %d\n", |
525 gDrawImageCalls.load(), | 523 gDrawImageCalls.load(), |
526 gJpegImageObjects.load(), | 524 gJpegImageObjects.load(), |
527 gRegularImageObjects.load()); | 525 gRegularImageObjects.load()); |
528 } | 526 } |
529 #endif // SK_PDF_IMAGE_STATS | 527 #endif // SK_PDF_IMAGE_STATS |
OLD | NEW |