2 * Copyright 2012 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "SkImagePriv.h"
10 #include "SkPicture.h"
12 SkBitmap::Config SkImageInfoToBitmapConfig(const SkImageInfo& info) {
13 switch (info.fColorType) {
14 case kAlpha_8_SkColorType:
15 return SkBitmap::kA8_Config;
17 case kRGB_565_SkColorType:
18 return SkBitmap::kRGB_565_Config;
20 case kPMColor_SkColorType:
21 return SkBitmap::kARGB_8888_Config;
24 // break for unsupported colortypes
27 return SkBitmap::kNo_Config;
30 int SkImageBytesPerPixel(SkColorType ct) {
31 static const uint8_t gColorTypeBytesPerPixel[] = {
32 1, // kAlpha_8_SkColorType
33 2, // kRGB_565_SkColorType
34 4, // kRGBA_8888_SkColorType
35 4, // kBGRA_8888_SkColorType
36 4, // kPMColor_SkColorType
39 SkASSERT((size_t)ct < SK_ARRAY_COUNT(gColorTypeBytesPerPixel));
40 return gColorTypeBytesPerPixel[ct];
43 bool SkBitmapToImageInfo(const SkBitmap& bm, SkImageInfo* info) {
44 switch (bm.config()) {
45 case SkBitmap::kA8_Config:
46 info->fColorType = kAlpha_8_SkColorType;
49 case SkBitmap::kRGB_565_Config:
50 info->fColorType = kRGB_565_SkColorType;
53 case SkBitmap::kARGB_8888_Config:
54 info->fColorType = kPMColor_SkColorType;
61 info->fWidth = bm.width();
62 info->fHeight = bm.height();
63 info->fAlphaType = bm.isOpaque() ? kOpaque_SkAlphaType :
68 SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef) {
70 if (!SkBitmapToImageInfo(bm, &info)) {
74 SkImage* image = NULL;
75 if (canSharePixelRef || bm.isImmutable()) {
76 image = SkNewImageFromPixelRef(info, bm.pixelRef(), bm.rowBytes());
80 image = SkImage::NewRasterCopy(info, bm.getPixels(), bm.rowBytes());
87 static bool needs_layer(const SkPaint& paint) {
88 return 0xFF != paint.getAlpha() ||
89 paint.getColorFilter() ||
90 paint.getImageFilter() ||
91 SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode);
94 void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture,
95 SkScalar x, SkScalar y, const SkPaint* paint) {
96 int saveCount = canvas->getSaveCount();
98 if (paint && needs_layer(*paint)) {
101 x + SkIntToScalar(picture->width()),
102 y + SkIntToScalar(picture->height()));
103 canvas->saveLayer(&bounds, paint);
104 canvas->translate(x, y);
107 canvas->translate(x, y);
110 canvas->drawPicture(*picture);
111 canvas->restoreToCount(saveCount);
114 void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture,
115 const SkRect* src, const SkRect& dst, const SkPaint* paint) {
116 int saveCount = canvas->getSaveCount();
125 SkIntToScalar(picture->width()),
126 SkIntToScalar(picture->height()));
129 matrix.setRectToRect(tmpSrc, dst, SkMatrix::kFill_ScaleToFit);
130 if (paint && needs_layer(*paint)) {
131 canvas->saveLayer(&dst, paint);
135 canvas->concat(matrix);
136 if (!paint || !needs_layer(*paint)) {
137 canvas->clipRect(tmpSrc);
140 canvas->drawPicture(*picture);
141 canvas->restoreToCount(saveCount);