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) |
275 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*
) override; | 277 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*
) override; |
276 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, | 278 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, |
277 const SkPaint*) override; | 279 const SkPaint*) override; |
| 280 #endif |
278 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect&
dst, | 281 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect&
dst, |
279 const SkPaint*) override; | 282 const SkPaint*) override; |
280 void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) overri
de; | 283 void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) overri
de; |
281 void onDrawVertices(VertexMode vmode, int vertexCount, | 284 void onDrawVertices(VertexMode vmode, int vertexCount, |
282 const SkPoint vertices[], const SkPoint texs[], | 285 const SkPoint vertices[], const SkPoint texs[], |
283 const SkColor colors[], SkXfermode* xmode, | 286 const SkColor colors[], SkXfermode* xmode, |
284 const uint16_t indices[], int indexCount, | 287 const uint16_t indices[], int indexCount, |
285 const SkPaint&) override; | 288 const SkPaint&) override; |
286 void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; | 289 void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; |
287 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; | 290 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; |
288 void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; | 291 void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; |
289 void onClipRegion(const SkRegion&, SkRegion::Op) override; | 292 void onClipRegion(const SkRegion&, SkRegion::Op) override; |
290 | 293 |
291 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) overri
de; | 294 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) overri
de; |
292 | 295 |
293 private: | 296 private: |
294 void recordTranslate(const SkMatrix&); | 297 void recordTranslate(const SkMatrix&); |
295 void recordScale(const SkMatrix&); | 298 void recordScale(const SkMatrix&); |
296 void recordConcat(const SkMatrix&); | 299 void recordConcat(const SkMatrix&); |
297 | 300 |
298 SkNamedFactorySet* fFactorySet; | 301 SkNamedFactorySet* fFactorySet; |
299 SkBitmapHeap* fBitmapHeap; | 302 SkBitmapHeap* fBitmapHeap; |
300 SkImageHeap* fImageHeap; | |
301 SkGPipeController* fController; | 303 SkGPipeController* fController; |
302 SkWriter32& fWriter; | 304 SkWriter32& fWriter; |
303 size_t fBlockSize; // amount allocated for writer | 305 size_t fBlockSize; // amount allocated for writer |
304 size_t fBytesNotified; | 306 size_t fBytesNotified; |
305 bool fDone; | 307 bool fDone; |
306 const uint32_t fFlags; | 308 const uint32_t fFlags; |
307 | 309 |
308 SkRefCntSet fTypefaceSet; | 310 SkRefCntSet fTypefaceSet; |
309 | 311 |
310 uint32_t getTypefaceID(SkTypeface*); | 312 uint32_t getTypefaceID(SkTypeface*); |
(...skipping 28 matching lines...) Expand all Loading... |
339 | 341 |
340 FlattenableHeap fFlattenableHeap; | 342 FlattenableHeap fFlattenableHeap; |
341 FlatDictionary fFlatDictionary; | 343 FlatDictionary fFlatDictionary; |
342 SkAutoTUnref<BitmapShuttle> fBitmapShuttle; | 344 SkAutoTUnref<BitmapShuttle> fBitmapShuttle; |
343 int fCurrFlatIndex[kCount_PaintFlats]; | 345 int fCurrFlatIndex[kCount_PaintFlats]; |
344 | 346 |
345 int flattenToIndex(SkFlattenable* obj, PaintFlats); | 347 int flattenToIndex(SkFlattenable* obj, PaintFlats); |
346 | 348 |
347 // Common code used by drawBitmap*. Behaves differently depending on the | 349 // Common code used by drawBitmap*. Behaves differently depending on the |
348 // type of SkBitmapHeap being used, which is determined by the flags used. | 350 // type of SkBitmapHeap being used, which is determined by the flags used. |
349 bool commonDrawBitmap(const SkBitmap&, DrawOps, unsigned flags, size_t bytes
, const SkPaint*); | 351 bool commonDrawBitmap(const SkBitmap& bm, DrawOps op, unsigned flags, |
350 bool commonDrawImage(const SkImage*, DrawOps, unsigned flags, size_t bytes,
const SkPaint*); | 352 size_t opBytesNeeded, const SkPaint* paint); |
351 | 353 |
352 SkPaint fPaint; | 354 SkPaint fPaint; |
353 void writePaint(const SkPaint&); | 355 void writePaint(const SkPaint&); |
354 | 356 |
355 class AutoPipeNotify { | 357 class AutoPipeNotify { |
356 public: | 358 public: |
357 AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} | 359 AutoPipeNotify(SkGPipeCanvas* canvas) : fCanvas(canvas) {} |
358 ~AutoPipeNotify() { fCanvas->doNotify(); } | 360 ~AutoPipeNotify() { fCanvas->doNotify(); } |
359 private: | 361 private: |
360 SkGPipeCanvas* fCanvas; | 362 SkGPipeCanvas* fCanvas; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO
_KEEP)); | 455 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, (fBitmapShuttle.get(), BITMAPS_TO
_KEEP)); |
454 } else { | 456 } else { |
455 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, | 457 fBitmapHeap = SkNEW_ARGS(SkBitmapHeap, |
456 (BITMAPS_TO_KEEP, controller->numberOfReaders()
)); | 458 (BITMAPS_TO_KEEP, controller->numberOfReaders()
)); |
457 if (this->needOpBytes(sizeof(void*))) { | 459 if (this->needOpBytes(sizeof(void*))) { |
458 this->writeOp(kShareBitmapHeap_DrawOp); | 460 this->writeOp(kShareBitmapHeap_DrawOp); |
459 fWriter.writePtr(static_cast<void*>(fBitmapHeap)); | 461 fWriter.writePtr(static_cast<void*>(fBitmapHeap)); |
460 } | 462 } |
461 } | 463 } |
462 fFlattenableHeap.setBitmapStorage(fBitmapHeap); | 464 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 | |
470 this->doNotify(); | 465 this->doNotify(); |
471 } | 466 } |
472 | 467 |
473 SkGPipeCanvas::~SkGPipeCanvas() { | 468 SkGPipeCanvas::~SkGPipeCanvas() { |
474 this->finish(true); | 469 this->finish(true); |
475 SkSafeUnref(fFactorySet); | 470 SkSafeUnref(fFactorySet); |
476 SkSafeUnref(fBitmapHeap); | 471 SkSafeUnref(fBitmapHeap); |
477 SkSafeUnref(fImageHeap); | |
478 } | 472 } |
479 | 473 |
480 bool SkGPipeCanvas::needOpBytes(size_t needed) { | 474 bool SkGPipeCanvas::needOpBytes(size_t needed) { |
481 if (fDone) { | 475 if (fDone) { |
482 return false; | 476 return false; |
483 } | 477 } |
484 | 478 |
485 needed += 4; // size of DrawOp atom | 479 needed += 4; // size of DrawOp atom |
486 needed = SkAlign4(needed); | 480 needed = SkAlign4(needed); |
487 if (fWriter.bytesWritten() + needed > fBlockSize) { | 481 if (fWriter.bytesWritten() + needed > fBlockSize) { |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 void SkGPipeCanvas::onDrawSprite(const SkBitmap& bm, int left, int top, const Sk
Paint* paint) { | 816 void SkGPipeCanvas::onDrawSprite(const SkBitmap& bm, int left, int top, const Sk
Paint* paint) { |
823 NOTIFY_SETUP(this); | 817 NOTIFY_SETUP(this); |
824 size_t opBytesNeeded = sizeof(int32_t) * 2; | 818 size_t opBytesNeeded = sizeof(int32_t) * 2; |
825 | 819 |
826 if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint))
{ | 820 if (this->commonDrawBitmap(bm, kDrawSprite_DrawOp, 0, opBytesNeeded, paint))
{ |
827 fWriter.write32(left); | 821 fWriter.write32(left); |
828 fWriter.write32(top); | 822 fWriter.write32(top); |
829 } | 823 } |
830 } | 824 } |
831 | 825 |
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 | |
879 void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x,
SkScalar y, | 826 void SkGPipeCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x,
SkScalar y, |
880 const SkPaint& paint) { | 827 const SkPaint& paint) { |
881 if (byteLength) { | 828 if (byteLength) { |
882 NOTIFY_SETUP(this); | 829 NOTIFY_SETUP(this); |
883 this->writePaint(paint); | 830 this->writePaint(paint); |
884 if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar)))
{ | 831 if (this->needOpBytes(4 + SkAlign4(byteLength) + 2 * sizeof(SkScalar)))
{ |
885 this->writeOp(kDrawText_DrawOp); | 832 this->writeOp(kDrawText_DrawOp); |
886 fWriter.write32(SkToU32(byteLength)); | 833 fWriter.write32(SkToU32(byteLength)); |
887 fWriter.writePad(text, byteLength); | 834 fWriter.writePad(text, byteLength); |
888 fWriter.writeScalar(x); | 835 fWriter.writeScalar(x); |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1383 return fCanvas->shuttleBitmap(bitmap, slot); | 1330 return fCanvas->shuttleBitmap(bitmap, slot); |
1384 } | 1331 } |
1385 | 1332 |
1386 void BitmapShuttle::removeCanvas() { | 1333 void BitmapShuttle::removeCanvas() { |
1387 if (NULL == fCanvas) { | 1334 if (NULL == fCanvas) { |
1388 return; | 1335 return; |
1389 } | 1336 } |
1390 fCanvas->unref(); | 1337 fCanvas->unref(); |
1391 fCanvas = NULL; | 1338 fCanvas = NULL; |
1392 } | 1339 } |
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 |