37
37
#include " SkRect.h"
38
38
#include " SkRegion.h"
39
39
#include " SkStream.h"
40
+ #include " SyncProxyCanvas.h"
40
41
#include " TimeCounter.h"
41
42
42
43
#ifdef CACHED_IMAGE_DECODE
43
44
#include < wtf/PassOwnPtr.h>
44
45
#include " SkPixelRef.h"
45
- #include " SyncProxyCanvas.h"
46
46
#endif
47
47
48
48
#define MAX_DRAW_TIME 100
@@ -247,8 +247,9 @@ class BitmapProxyCanvas: public SyncProxyCanvas, public Noncopyable
247
247
public:
248
248
static WTF::PassOwnPtr<BitmapProxyCanvas> create (SkCanvas* canvas,
249
249
WTF::Vector<const SkBitmap*>* pBitmaps,
250
- WTF::Vector<SkRect>* pBitmapRects) {
251
- return new BitmapProxyCanvas (canvas, pBitmaps, pBitmapRects);
250
+ WTF::Vector<SkRect>* pBitmapRects,
251
+ bool invert) {
252
+ return new BitmapProxyCanvas (canvas, pBitmaps, pBitmapRects, invert);
252
253
}
253
254
254
255
virtual void drawBitmap (const SkBitmap& bitmap, SkScalar x, SkScalar y,
@@ -265,6 +266,16 @@ class BitmapProxyCanvas: public SyncProxyCanvas, public Noncopyable
265
266
appendBitmap (bitmap, fastBounds);
266
267
} else {
267
268
target->drawBitmap (bitmap, x, y, paint);
269
+ if (invertBitmaps) {
270
+ target->save ();
271
+ SkRect inversionRect;
272
+ inversionRect.set (x, y,
273
+ x + SkIntToScalar (bitmap.width ()),
274
+ y + SkIntToScalar (bitmap.height ()));
275
+ target->clipRect (inversionRect);
276
+ target->drawARGB (255 , 255 , 255 , 255 , SkXfermode::kDifference_Mode );
277
+ target->restore ();
278
+ }
268
279
}
269
280
}
270
281
@@ -278,6 +289,12 @@ class BitmapProxyCanvas: public SyncProxyCanvas, public Noncopyable
278
289
appendBitmap (bitmap, dst);
279
290
} else {
280
291
target->drawBitmapRect (bitmap, src, dst, paint);
292
+ if (invertBitmaps) {
293
+ target->save ();
294
+ target->clipRect (dst);
295
+ target->drawARGB (255 , 255 , 255 , 255 , SkXfermode::kDifference_Mode );
296
+ target->restore ();
297
+ }
281
298
}
282
299
}
283
300
@@ -290,13 +307,16 @@ class BitmapProxyCanvas: public SyncProxyCanvas, public Noncopyable
290
307
291
308
WTF::Vector<const SkBitmap*> *pBitmapsForDecoding;
292
309
WTF::Vector<SkRect> *pBitmapRectsForDecoding;
310
+ bool invertBitmaps;
293
311
294
312
BitmapProxyCanvas (SkCanvas* canvas,
295
313
WTF::Vector<const SkBitmap*> *pBitmaps,
296
- WTF::Vector<SkRect> *pBitmapRects)
314
+ WTF::Vector<SkRect> *pBitmapRects,
315
+ bool invert)
297
316
: SyncProxyCanvas(canvas)
298
317
, pBitmapsForDecoding(pBitmaps)
299
318
, pBitmapRectsForDecoding(pBitmapRects)
319
+ , invertBitmaps(invert)
300
320
{
301
321
}
302
322
@@ -342,9 +362,38 @@ class BitmapProxyCanvas: public SyncProxyCanvas, public Noncopyable
342
362
}
343
363
};
344
364
365
+ #else
366
+ class ImageInverter : public SyncProxyCanvas
367
+ {
368
+ public:
369
+
370
+ ImageInverter (SkCanvas* canvas): SyncProxyCanvas(canvas) {}
371
+
372
+ void drawBitmap (const SkBitmap& bitmap, SkScalar x, SkScalar y,
373
+ const SkPaint* paint) {
374
+ target->drawBitmap (bitmap, x, y, paint);
375
+ target->save ();
376
+ SkRect inversionRect;
377
+ inversionRect.set (x, y,
378
+ x + SkIntToScalar (bitmap.width ()),
379
+ y + SkIntToScalar (bitmap.height ()));
380
+ target->clipRect (inversionRect);
381
+ target->drawARGB (255 , 255 , 255 , 255 , SkXfermode::kDifference_Mode );
382
+ target->restore ();
383
+ }
384
+
385
+ void drawBitmapRect (const SkBitmap& bitmap, const SkIRect* src,
386
+ const SkRect& dst, const SkPaint* paint) {
387
+ target->drawBitmapRect (bitmap, src, dst, paint);
388
+ target->save ();
389
+ target->clipRect (dst);
390
+ target->drawARGB (255 , 255 , 255 , 255 , SkXfermode::kDifference_Mode );
391
+ target->restore ();
392
+ }
393
+ };
345
394
#endif
346
395
347
- bool PictureSet::draw (SkCanvas* canvas)
396
+ bool PictureSet::draw (SkCanvas* canvas, bool invertColor )
348
397
{
349
398
validate (__FUNCTION__);
350
399
Pictures* first = mPictures .begin ();
@@ -405,11 +454,14 @@ bool PictureSet::draw(SkCanvas* canvas)
405
454
uint32_t startTime = getThreadMsec ();
406
455
#ifdef CACHED_IMAGE_DECODE
407
456
{
408
- WTF::OwnPtr<BitmapProxyCanvas> proxyCanvas = BitmapProxyCanvas::create (canvas, &mBitmapsForDecoding , &mBitmapRectsForDecoding );
457
+ WTF::OwnPtr<BitmapProxyCanvas> proxyCanvas = BitmapProxyCanvas::create (canvas, &mBitmapsForDecoding , &mBitmapRectsForDecoding , invertColor );
409
458
proxyCanvas->drawPicture (*working->mPicture );
410
459
}
411
460
#else
412
- canvas->drawPicture (*working->mPicture );
461
+ SkCanvas* painter = invertColor ? new ImageInverter (canvas) : canvas;
462
+ painter->drawPicture (*working->mPicture );
463
+ if (invertColor)
464
+ delete painter;
413
465
#endif
414
466
size_t elapsed = working->mElapsed = getThreadMsec () - startTime;
415
467
working->mWroteElapsed = true ;
@@ -441,6 +493,8 @@ bool PictureSet::draw(SkCanvas* canvas)
441
493
working->mElapsed , working->mBase ? " true" : " false" );
442
494
}
443
495
// dump(__FUNCTION__);
496
+ if (invertColor)
497
+ canvas->drawARGB (255 , 255 , 255 , 255 , SkXfermode::kDifference_Mode );
444
498
return maxElapsed >= MAX_DRAW_TIME;
445
499
}
446
500
0 commit comments