blob: 976a5b33335fb549b08b61be8f6236031a0747f2 [file] [log] [blame]
reed@google.com6997ebb2012-07-30 19:50:31 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
reed@google.com889b09e2012-07-27 21:10:42 +00008#include "SkImagePriv.h"
mike@reedtribe.org70e35902012-07-29 20:38:16 +00009#include "SkCanvas.h"
10#include "SkPicture.h"
reed@google.com889b09e2012-07-27 21:10:42 +000011
reed@google.com2bd8b812013-11-01 13:46:54 +000012SkBitmap::Config SkImageInfoToBitmapConfig(const SkImageInfo& info) {
reed@google.com889b09e2012-07-27 21:10:42 +000013 switch (info.fColorType) {
reed@google.com2bd8b812013-11-01 13:46:54 +000014 case kAlpha_8_SkColorType:
reed@google.com383a6972013-10-21 14:00:07 +000015 return SkBitmap::kA8_Config;
reed@google.com889b09e2012-07-27 21:10:42 +000016
reed@google.com9230ea22013-12-09 22:01:03 +000017 case kARGB_4444_SkColorType:
18 return SkBitmap::kARGB_4444_Config;
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000019
reed@google.com2bd8b812013-11-01 13:46:54 +000020 case kRGB_565_SkColorType:
reed@google.com889b09e2012-07-27 21:10:42 +000021 return SkBitmap::kRGB_565_Config;
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000022
reed@google.com2bd8b812013-11-01 13:46:54 +000023 case kPMColor_SkColorType:
reed@google.com383a6972013-10-21 14:00:07 +000024 return SkBitmap::kARGB_8888_Config;
skia.committer@gmail.com572a8652013-09-21 07:01:53 +000025
reed@google.com9230ea22013-12-09 22:01:03 +000026 case kIndex_8_SkColorType:
reed@google.com23be7a52013-11-12 16:11:07 +000027 return SkBitmap::kIndex8_Config;
28
reed@google.comd28ba802013-09-20 19:33:52 +000029 default:
30 // break for unsupported colortypes
31 break;
reed@google.com889b09e2012-07-27 21:10:42 +000032 }
reed@google.com889b09e2012-07-27 21:10:42 +000033 return SkBitmap::kNo_Config;
34}
35
reed@google.com97af1a62012-08-28 12:19:02 +000036SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef) {
reed@google.com2bd8b812013-11-01 13:46:54 +000037 SkImageInfo info;
reed@google.com9230ea22013-12-09 22:01:03 +000038 if (!bm.asImageInfo(&info)) {
reed@google.com889b09e2012-07-27 21:10:42 +000039 return NULL;
40 }
41
42 SkImage* image = NULL;
reed@google.com97af1a62012-08-28 12:19:02 +000043 if (canSharePixelRef || bm.isImmutable()) {
reed@google.com889b09e2012-07-27 21:10:42 +000044 image = SkNewImageFromPixelRef(info, bm.pixelRef(), bm.rowBytes());
45 } else {
46 bm.lockPixels();
mike@reedtribe.org70e35902012-07-29 20:38:16 +000047 if (bm.getPixels()) {
mike@reedtribe.orgb9476252012-11-15 02:37:45 +000048 image = SkImage::NewRasterCopy(info, bm.getPixels(), bm.rowBytes());
reed@google.com889b09e2012-07-27 21:10:42 +000049 }
50 bm.unlockPixels();
51 }
52 return image;
53}
54
mike@reedtribe.org70e35902012-07-29 20:38:16 +000055static bool needs_layer(const SkPaint& paint) {
56 return 0xFF != paint.getAlpha() ||
57 paint.getColorFilter() ||
58 paint.getImageFilter() ||
59 SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode);
60}
61
62void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture,
63 SkScalar x, SkScalar y, const SkPaint* paint) {
64 int saveCount = canvas->getSaveCount();
rmistry@google.comfbfcd562012-08-23 18:09:54 +000065
mike@reedtribe.org70e35902012-07-29 20:38:16 +000066 if (paint && needs_layer(*paint)) {
67 SkRect bounds;
68 bounds.set(x, y,
69 x + SkIntToScalar(picture->width()),
70 y + SkIntToScalar(picture->height()));
71 canvas->saveLayer(&bounds, paint);
reed@google.com9ea5a3b2012-07-30 21:03:46 +000072 canvas->translate(x, y);
mike@reedtribe.org70e35902012-07-29 20:38:16 +000073 } else if (x || y) {
74 canvas->save();
reed@google.com9ea5a3b2012-07-30 21:03:46 +000075 canvas->translate(x, y);
mike@reedtribe.org70e35902012-07-29 20:38:16 +000076 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000077
mike@reedtribe.org70e35902012-07-29 20:38:16 +000078 canvas->drawPicture(*picture);
79 canvas->restoreToCount(saveCount);
80}
commit-bot@chromium.orgdfec28d2013-07-23 15:52:16 +000081
82void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture,
skia.committer@gmail.com7f1af502013-07-24 07:01:12 +000083 const SkRect* src, const SkRect& dst, const SkPaint* paint) {
84 int saveCount = canvas->getSaveCount();
commit-bot@chromium.orgdfec28d2013-07-23 15:52:16 +000085
86 SkMatrix matrix;
87 SkRect tmpSrc;
88
89 if (NULL != src) {
90 tmpSrc = *src;
91 } else {
92 tmpSrc.set(0, 0,
93 SkIntToScalar(picture->width()),
94 SkIntToScalar(picture->height()));
95 }
96
97 matrix.setRectToRect(tmpSrc, dst, SkMatrix::kFill_ScaleToFit);
98 if (paint && needs_layer(*paint)) {
99 canvas->saveLayer(&dst, paint);
100 } else {
101 canvas->save();
102 }
103 canvas->concat(matrix);
104 if (!paint || !needs_layer(*paint)) {
105 canvas->clipRect(tmpSrc);
106 }
skia.committer@gmail.com7f1af502013-07-24 07:01:12 +0000107
commit-bot@chromium.orgdfec28d2013-07-23 15:52:16 +0000108 canvas->drawPicture(*picture);
109 canvas->restoreToCount(saveCount);
110}