OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * 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 |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkAnnotation.h" | 9 #include "SkAnnotation.h" |
10 #include "SkBitmapDevice.h" | 10 #include "SkBitmapDevice.h" |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 const SkPaint& paint) override; | 265 const SkPaint& paint) override; |
266 void onDrawPaint(const SkPaint&) override; | 266 void onDrawPaint(const SkPaint&) override; |
267 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPain
t&) override; | 267 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPain
t&) override; |
268 void onDrawRect(const SkRect&, const SkPaint&) override; | 268 void onDrawRect(const SkRect&, const SkPaint&) override; |
269 void onDrawOval(const SkRect&, const SkPaint&) override; | 269 void onDrawOval(const SkRect&, const SkPaint&) override; |
270 void onDrawRRect(const SkRRect&, const SkPaint&) override; | 270 void onDrawRRect(const SkRRect&, const SkPaint&) override; |
271 void onDrawPath(const SkPath&, const SkPaint&) override; | 271 void onDrawPath(const SkPath&, const SkPaint&) override; |
272 void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPain
t*) override; | 272 void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPain
t*) override; |
273 void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst,
const SkPaint*, | 273 void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst,
const SkPaint*, |
274 DrawBitmapRectFlags flags) override; | 274 DrawBitmapRectFlags flags) override; |
275 #if 0 | |
276 // rely on decomposition into bitmap (for now) | |
277 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*
) override; | 275 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*
) override; |
278 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, | 276 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, |
279 const SkPaint*) override; | 277 const SkPaint*) override; |
280 #endif | |
281 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect&
dst, | 278 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect&
dst, |
282 const SkPaint*) override; | 279 const SkPaint*) override; |
283 void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) overri
de; | 280 void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) overri
de; |
284 void onDrawVertices(VertexMode vmode, int vertexCount, | 281 void onDrawVertices(VertexMode vmode, int vertexCount, |
285 const SkPoint vertices[], const SkPoint texs[], | 282 const SkPoint vertices[], const SkPoint texs[], |
286 const SkColor colors[], SkXfermode* xmode, | 283 const SkColor colors[], SkXfermode* xmode, |
287 const uint16_t indices[], int indexCount, | 284 const uint16_t indices[], int indexCount, |
288 const SkPaint&) override; | 285 const SkPaint&) override; |
289 void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; | 286 void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; |
290 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; | 287 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; |
291 void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; | 288 void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; |
292 void onClipRegion(const SkRegion&, SkRegion::Op) override; | 289 void onClipRegion(const SkRegion&, SkRegion::Op) override; |
293 | 290 |
294 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) overri
de; | 291 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) overri
de; |
295 | 292 |
296 private: | 293 private: |
297 void recordTranslate(const SkMatrix&); | 294 void recordTranslate(const SkMatrix&); |
298 void recordScale(const SkMatrix&); | 295 void recordScale(const SkMatrix&); |
299 void recordConcat(const SkMatrix&); | 296 void recordConcat(const SkMatrix&); |
300 | 297 |
301 SkNamedFactorySet* fFactorySet; | 298 SkNamedFactorySet* fFactorySet; |
302 SkBitmapHeap* fBitmapHeap; | 299 SkBitmapHeap* fBitmapHeap; |
| 300 SkImageHeap* fImageHeap; |
303 SkGPipeController* fController; | 301 SkGPipeController* fController; |
304 SkWriter32& fWriter; | 302 SkWriter32& fWriter; |
305 size_t fBlockSize; // amount allocated for writer | 303 size_t fBlockSize; // amount allocated for writer |
306 size_t fBytesNotified; | 304 size_t fBytesNotified; |
307 bool fDone; | 305 bool fDone; |
308 const uint32_t fFlags; | 306 const uint32_t fFlags; |
309 | 307 |
310 SkRefCntSet fTypefaceSet; | 308 SkRefCntSet fTypefaceSet; |
311 | 309 |
312 uint32_t getTypefaceID(SkTypeface*); | 310 uint32_t getTypefaceID(SkTypeface*); |
(...skipping 28 matching lines...) Expand all Loading... |
341 | 339 |
342 FlattenableHeap fFlattenableHeap; | 340 FlattenableHeap fFlattenableHeap; |
343 FlatDictionary fFlatDictionary; | 341 FlatDictionary fFlatDictionary; |
344 SkAutoTUnref<BitmapShuttle> fBitmapShuttle; | 342 SkAutoTUnref<BitmapShuttle> fBitmapShuttle; |
345 int fCurrFlatIndex[kCount_PaintFlats]; | 343 int fCurrFlatIndex[kCount_PaintFlats]; |
346 | 344 |
347 int flattenToIndex(SkFlattenable* obj, PaintFlats); | 345 int flattenToIndex(SkFlattenable* obj, PaintFlats); |
348 | 346 |
349 // Common code used by drawBitmap*. Behaves differently depending on the | 347 // Common code used by drawBitmap*. Behaves differently depending on the |
350 // type of SkBitmapHeap being used, which is determined by the flags used. | 348 // type of SkBitmapHeap being used, which is determined by the flags used. |
351 bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, | 349 bool commonDrawBitmap(const SkBitmap&, DrawOps, unsigned flags, size_t bytes
, const SkPaint*); |
352 size_t opBytesNeeded, const SkPaint* paint); | 350 bool commonDrawImage(const SkImage*, DrawOps, unsigned flags, size_t bytes,
const SkPaint*); |
353 | 351 |
354 SkPaint fPaint; | 352 SkPaint fPaint; |
355 void writePaint(const SkPaint&); | 353 void writePaint(const SkPaint&); |
356 | 354 |
357 class AutoPipeNotify { | 355 class AutoPipeNotify { |
358 public: | 356 public: |
359 AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} | 357 AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} |
360 ~AutoPipeNotify() { fCanvas->doNotify(); } | 358 ~AutoPipeNotify() { fCanvas->doNotify(); } |
361 private: | 359 private: |
362 SkGPipeCanvas* fCanvas; | 360 SkGPipeCanvas* fCanvas; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO
_KEEP)); | 453 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO
_KEEP)); |
456 } else { | 454 } else { |
457 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, | 455 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, |
458 (BITMAPS_TO_KEEP, controller->numberOfReaders()
)); | 456 (BITMAPS_TO_KEEP, controller->numberOfReaders()
)); |
459 if (this->needOpBytes(sizeof(void*))) { | 457 if (this->needOpBytes(sizeof(void*))) { |
460 this->writeOp(kShareBitmapHeap_DrawOp); | 458 this->writeOp(kShareBitmapHeap_DrawOp); |
461 fWriter.writePtr(static_cast<void*>(fBitmapHeap)); | 459 fWriter.writePtr(static_cast<void*>(fBitmapHeap)); |
462 } | 460 } |
463 } | 461 } |
464 fFlattenableHeap.setBitmapStorage(fBitmapHeap); | 462 fFlattenableHeap.setBitmapStorage(fBitmapHeap); |
| 463 |
| 464 fImageHeap = SkNEW(SkImageHeap); |
| 465 if (this->needOpBytes(sizeof(void*))) { |
| 466 this->writeOp(kShareImageHeap_DrawOp); |
| 467 fWriter.writePtr(static_cast<void*>(fImageHeap)); |
| 468 } |
| 469 |
465 this->doNotify(); | 470 this->doNotify(); |
466 } | 471 } |
467 | 472 |
468 SkGPipeCanvas::~SkGPipeCanvas() { | 473 SkGPipeCanvas::~SkGPipeCanvas() { |
469 this->finish(true); | 474 this->finish(true); |
470 SkSafeUnref(fFactorySet); | 475 SkSafeUnref(fFactorySet); |
471 SkSafeUnref(fBitmapHeap); | 476 SkSafeUnref(fBitmapHeap); |
| 477 SkSafeUnref(fImageHeap); |
472 } | 478 } |
473 | 479 |
474 bool SkGPipeCanvas::needOpBytes(size_t needed) { | 480 bool SkGPipeCanvas::needOpBytes(size_t needed) { |
475 if (fDone) { | 481 if (fDone) { |
476 return false; | 482 return false; |
477 } | 483 } |
478 | 484 |
479 needed += 4; // size of DrawOp atom | 485 needed += 4; // size of DrawOp atom |
480 needed = SkAlign4(needed); | 486 needed = SkAlign4(needed); |
481 if (fWriter.bytesWritten() + needed > fBlockSize) { | 487 if (fWriter.bytesWritten() + needed > fBlockSize) { |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 void SkGPipeCanvas::onDrawSprite(const SkBitmap& bm, int left, int top, const Sk
Paint* paint) { | 822 void SkGPipeCanvas::onDrawSprite(const SkBitmap& bm, int left, int top, const Sk
Paint* paint) { |
817 NOTIFY_SETUP(this); | 823 NOTIFY_SETUP(this); |
818 size_t opBytesNeeded = sizeof(int32_t) * 2; | 824 size_t opBytesNeeded = sizeof(int32_t) * 2; |
819 | 825 |
820 if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint))
{ | 826 if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint))
{ |
821 fWriter.write32(left); | 827 fWriter.write32(left); |
822 fWriter.write32(top); | 828 fWriter.write32(top); |
823 } | 829 } |
824 } | 830 } |
825 | 831 |
| 832 bool SkGPipeCanvas::commonDrawImage(const SkImage* image, DrawOps op, unsigned f
lags, |
| 833 size_t opBytesNeeded, const SkPaint* paint)
{ |
| 834 if (fDone) { |
| 835 return false; |
| 836 } |
| 837 |
| 838 if (paint != NULL) { |
| 839 flags |= kDrawBitmap_HasPaint_DrawOpFlag; |
| 840 this->writePaint(*paint); |
| 841 } |
| 842 // This needs to run first so its calls to needOpBytes() and its writes |
| 843 // don't interlace with the needOpBytes() and write below. |
| 844 int32_t slot = fImageHeap->insert(image); |
| 845 SkASSERT(slot != 0); |
| 846 if (this->needOpBytes(opBytesNeeded)) { |
| 847 this->writeOp(op, flags, slot); |
| 848 return true; |
| 849 } |
| 850 return false; |
| 851 } |
| 852 |
| 853 void SkGPipeCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, |
| 854 const SkPaint* paint) { |
| 855 NOTIFY_SETUP(this); |
| 856 if (this->commonDrawImage(image, kDrawImage_DrawOp, 0, sizeof(SkScalar) * 2,
paint)) { |
| 857 fWriter.writeScalar(x); |
| 858 fWriter.writeScalar(y); |
| 859 } |
| 860 } |
| 861 |
| 862 void SkGPipeCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, con
st SkRect& dst, |
| 863 const SkPaint* paint) { |
| 864 NOTIFY_SETUP(this); |
| 865 unsigned flags = 0; |
| 866 size_t opBytesNeeded = sizeof(SkRect); // dst |
| 867 if (src) { |
| 868 flags |= kDrawBitmap_HasSrcRect_DrawOpFlag; |
| 869 opBytesNeeded += sizeof(SkRect); // src |
| 870 } |
| 871 if (this->commonDrawImage(image, kDrawImageRect_DrawOp, flags, opBytesNeeded
, paint)) { |
| 872 if (src) { |
| 873 fWriter.writeRect(*src); |
| 874 } |
| 875 fWriter.writeRect(dst); |
| 876 } |
| 877 } |
| 878 |
826 void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x,
SkScalar y, | 879 void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x,
SkScalar y, |
827 const SkPaint& paint) { | 880 const SkPaint& paint) { |
828 if (byteLength) { | 881 if (byteLength) { |
829 NOTIFY_SETUP(this); | 882 NOTIFY_SETUP(this); |
830 this->writePaint(paint); | 883 this->writePaint(paint); |
831 if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar)))
{ | 884 if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar)))
{ |
832 this->writeOp(kDrawText_DrawOp); | 885 this->writeOp(kDrawText_DrawOp); |
833 fWriter.write32(SkToU32(byteLength)); | 886 fWriter.write32(SkToU32(byteLength)); |
834 fWriter.writePad(text, byteLength); | 887 fWriter.writePad(text, byteLength); |
835 fWriter.writeScalar(x); | 888 fWriter.writeScalar(x); |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 return fCanvas->shuttleBitmap(bitmap, slot); | 1383 return fCanvas->shuttleBitmap(bitmap, slot); |
1331 } | 1384 } |
1332 | 1385 |
1333 void BitmapShuttle::removeCanvas() { | 1386 void BitmapShuttle::removeCanvas() { |
1334 if (NULL == fCanvas) { | 1387 if (NULL == fCanvas) { |
1335 return; | 1388 return; |
1336 } | 1389 } |
1337 fCanvas->unref(); | 1390 fCanvas->unref(); |
1338 fCanvas = NULL; | 1391 fCanvas = NULL; |
1339 } | 1392 } |
| 1393 |
| 1394 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 1395 |
| 1396 SkImageHeap::SkImageHeap() {} |
| 1397 |
| 1398 SkImageHeap::~SkImageHeap() { |
| 1399 fArray.unrefAll(); |
| 1400 } |
| 1401 |
| 1402 const SkImage* SkImageHeap::get(int32_t slot) const { |
| 1403 SkASSERT(slot > 0); |
| 1404 return fArray[slot - 1]; |
| 1405 } |
| 1406 |
| 1407 int32_t SkImageHeap::find(const SkImage* img) const { |
| 1408 int index = fArray.find(img); |
| 1409 if (index >= 0) { |
| 1410 return index + 1; // found |
| 1411 } |
| 1412 return 0; // not found |
| 1413 } |
| 1414 |
| 1415 int32_t SkImageHeap::insert(const SkImage* img) { |
| 1416 int32_t slot = this->find(img); |
| 1417 if (slot) { |
| 1418 return slot; |
| 1419 } |
| 1420 *fArray.append() = SkRef(img); |
| 1421 return fArray.count(); // slot is always index+1 |
| 1422 } |
| 1423 |
OLD | NEW |