blob: 43cc44b2fa25aa5762611e3bfcf39e467f2e29f8 [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
halcanary@google.com3d50ea12014-01-02 13:15:13 +000012SkBitmap::Config SkColorTypeToBitmapConfig(SkColorType colorType) {
13 switch (colorType) {
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
halcanary@google.com3d50ea12014-01-02 13:15:13 +000036SkBitmap::Config SkImageInfoToBitmapConfig(const SkImageInfo& info) {
37 return SkColorTypeToBitmapConfig(info.fColorType);
38}
39
40bool SkBitmapConfigToColorType(SkBitmap::Config config, SkColorType* ctOut) {
41 SkColorType ct;
42 switch (config) {
43 case SkBitmap::kA8_Config:
44 ct = kAlpha_8_SkColorType;
45 break;
46 case SkBitmap::kIndex8_Config:
47 ct = kIndex_8_SkColorType;
48 break;
49 case SkBitmap::kRGB_565_Config:
50 ct = kRGB_565_SkColorType;
51 break;
52 case SkBitmap::kARGB_4444_Config:
53 ct = kARGB_4444_SkColorType;
54 break;
55 case SkBitmap::kARGB_8888_Config:
56 ct = kPMColor_SkColorType;
57 break;
58 case SkBitmap::kNo_Config:
59 default:
60 return false;
61 }
62 if (ctOut) {
63 *ctOut = ct;
64 }
65 return true;
66}
67
68
reed@google.com97af1a62012-08-28 12:19:02 +000069SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef) {
reed@google.com2bd8b812013-11-01 13:46:54 +000070 SkImageInfo info;
reed@google.com9230ea22013-12-09 22:01:03 +000071 if (!bm.asImageInfo(&info)) {
reed@google.com889b09e2012-07-27 21:10:42 +000072 return NULL;
73 }
74
75 SkImage* image = NULL;
reed@google.com97af1a62012-08-28 12:19:02 +000076 if (canSharePixelRef || bm.isImmutable()) {
reed@google.com889b09e2012-07-27 21:10:42 +000077 image = SkNewImageFromPixelRef(info, bm.pixelRef(), bm.rowBytes());
78 } else {
79 bm.lockPixels();
mike@reedtribe.org70e35902012-07-29 20:38:16 +000080 if (bm.getPixels()) {
mike@reedtribe.orgb9476252012-11-15 02:37:45 +000081 image = SkImage::NewRasterCopy(info, bm.getPixels(), bm.rowBytes());
reed@google.com889b09e2012-07-27 21:10:42 +000082 }
83 bm.unlockPixels();
84 }
85 return image;
86}
87
mike@reedtribe.org70e35902012-07-29 20:38:16 +000088static bool needs_layer(const SkPaint& paint) {
89 return 0xFF != paint.getAlpha() ||
90 paint.getColorFilter() ||
91 paint.getImageFilter() ||
92 SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode);
93}
94
95void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture,
96 SkScalar x, SkScalar y, const SkPaint* paint) {
97 int saveCount = canvas->getSaveCount();
rmistry@google.comfbfcd562012-08-23 18:09:54 +000098
mike@reedtribe.org70e35902012-07-29 20:38:16 +000099 if (paint && needs_layer(*paint)) {
100 SkRect bounds;
101 bounds.set(x, y,
102 x + SkIntToScalar(picture->width()),
103 y + SkIntToScalar(picture->height()));
104 canvas->saveLayer(&bounds, paint);
reed@google.com9ea5a3b2012-07-30 21:03:46 +0000105 canvas->translate(x, y);
mike@reedtribe.org70e35902012-07-29 20:38:16 +0000106 } else if (x || y) {
107 canvas->save();
reed@google.com9ea5a3b2012-07-30 21:03:46 +0000108 canvas->translate(x, y);
mike@reedtribe.org70e35902012-07-29 20:38:16 +0000109 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000110
mike@reedtribe.org70e35902012-07-29 20:38:16 +0000111 canvas->drawPicture(*picture);
112 canvas->restoreToCount(saveCount);
113}
commit-bot@chromium.orgdfec28d2013-07-23 15:52:16 +0000114
115void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture,
skia.committer@gmail.com7f1af502013-07-24 07:01:12 +0000116 const SkRect* src, const SkRect& dst, const SkPaint* paint) {
117 int saveCount = canvas->getSaveCount();
commit-bot@chromium.orgdfec28d2013-07-23 15:52:16 +0000118
119 SkMatrix matrix;
120 SkRect tmpSrc;
121
122 if (NULL != src) {
123 tmpSrc = *src;
124 } else {
125 tmpSrc.set(0, 0,
126 SkIntToScalar(picture->width()),
127 SkIntToScalar(picture->height()));
128 }
129
130 matrix.setRectToRect(tmpSrc, dst, SkMatrix::kFill_ScaleToFit);
131 if (paint && needs_layer(*paint)) {
132 canvas->saveLayer(&dst, paint);
133 } else {
134 canvas->save();
135 }
136 canvas->concat(matrix);
137 if (!paint || !needs_layer(*paint)) {
138 canvas->clipRect(tmpSrc);
139 }
skia.committer@gmail.com7f1af502013-07-24 07:01:12 +0000140
commit-bot@chromium.orgdfec28d2013-07-23 15:52:16 +0000141 canvas->drawPicture(*picture);
142 canvas->restoreToCount(saveCount);
143}