SkImagePriv.cpp revision 61e96cd44624c9faceb625519c1b29775b161f45
16997ebbe5cf06c938cc893e1d0217dc4048edf82reed@google.com/* 26997ebbe5cf06c938cc893e1d0217dc4048edf82reed@google.com * Copyright 2012 Google Inc. 36997ebbe5cf06c938cc893e1d0217dc4048edf82reed@google.com * 46997ebbe5cf06c938cc893e1d0217dc4048edf82reed@google.com * Use of this source code is governed by a BSD-style license that can be 56997ebbe5cf06c938cc893e1d0217dc4048edf82reed@google.com * found in the LICENSE file. 66997ebbe5cf06c938cc893e1d0217dc4048edf82reed@google.com */ 76997ebbe5cf06c938cc893e1d0217dc4048edf82reed@google.com 8889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com#include "SkImagePriv.h" 970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "SkCanvas.h" 1070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org#include "SkPicture.h" 11889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com 123d50ea1b87132833d7eab38964f40315ba553205halcanary@google.comSkBitmap::Config SkColorTypeToBitmapConfig(SkColorType colorType) { 133d50ea1b87132833d7eab38964f40315ba553205halcanary@google.com switch (colorType) { 142bd8b8100529c96c81c30f749f672f4caf775b04reed@google.com case kAlpha_8_SkColorType: 15383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com return SkBitmap::kA8_Config; 16889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com 179230ea29718bcf1a92a89a1a518fb896bbbe00cfreed@google.com case kARGB_4444_SkColorType: 189230ea29718bcf1a92a89a1a518fb896bbbe00cfreed@google.com return SkBitmap::kARGB_4444_Config; 19cf0803b46f60d9fcb5ad9a376b638c4c32b655deskia.committer@gmail.com 202bd8b8100529c96c81c30f749f672f4caf775b04reed@google.com case kRGB_565_SkColorType: 21889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com return SkBitmap::kRGB_565_Config; 22cf0803b46f60d9fcb5ad9a376b638c4c32b655deskia.committer@gmail.com 232bd8b8100529c96c81c30f749f672f4caf775b04reed@google.com case kPMColor_SkColorType: 24383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com return SkBitmap::kARGB_8888_Config; 25572a86584602bcd9709d60f3c857750c4018c3d1skia.committer@gmail.com 269230ea29718bcf1a92a89a1a518fb896bbbe00cfreed@google.com case kIndex_8_SkColorType: 2723be7a58d9d69ae0a06788c2d798f2f92baea29creed@google.com return SkBitmap::kIndex8_Config; 2823be7a58d9d69ae0a06788c2d798f2f92baea29creed@google.com 29d28ba8010c6058bf073f7e815d5b2d7fdf698601reed@google.com default: 30d28ba8010c6058bf073f7e815d5b2d7fdf698601reed@google.com // break for unsupported colortypes 31d28ba8010c6058bf073f7e815d5b2d7fdf698601reed@google.com break; 32889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com } 33889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com return SkBitmap::kNo_Config; 34889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com} 35889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com 363d50ea1b87132833d7eab38964f40315ba553205halcanary@google.comSkBitmap::Config SkImageInfoToBitmapConfig(const SkImageInfo& info) { 373d50ea1b87132833d7eab38964f40315ba553205halcanary@google.com return SkColorTypeToBitmapConfig(info.fColorType); 383d50ea1b87132833d7eab38964f40315ba553205halcanary@google.com} 393d50ea1b87132833d7eab38964f40315ba553205halcanary@google.com 4061e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.orgSkColorType SkBitmapConfigToColorType(SkBitmap::Config config) { 4161e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org static const SkColorType gCT[] = { 4261e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org kUnknown_SkColorType, // kNo_Config 4361e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org kAlpha_8_SkColorType, // kA8_Config 4461e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org kIndex_8_SkColorType, // kIndex8_Config 4561e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org kRGB_565_SkColorType, // kRGB_565_Config 4661e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org kARGB_4444_SkColorType, // kARGB_4444_Config 4761e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org kPMColor_SkColorType, // kARGB_8888_Config 4861e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org }; 4961e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org SkASSERT((unsigned)config < SK_ARRAY_COUNT(gCT)); 5061e96cd44624c9faceb625519c1b29775b161f45commit-bot@chromium.org return gCT[config]; 513d50ea1b87132833d7eab38964f40315ba553205halcanary@google.com} 523d50ea1b87132833d7eab38964f40315ba553205halcanary@google.com 5397af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.comSkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef) { 542bd8b8100529c96c81c30f749f672f4caf775b04reed@google.com SkImageInfo info; 559230ea29718bcf1a92a89a1a518fb896bbbe00cfreed@google.com if (!bm.asImageInfo(&info)) { 56889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com return NULL; 57889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com } 58889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com 59889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com SkImage* image = NULL; 6097af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com if (canSharePixelRef || bm.isImmutable()) { 61e13af711d4ff9031c9ed3054a4c33a56a0c62e1fcommit-bot@chromium.org image = SkNewImageFromPixelRef(info, bm.pixelRef(), bm.rowBytes()); 62889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com } else { 63889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com bm.lockPixels(); 6470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org if (bm.getPixels()) { 65b947625800a26194fcf63d7b57dadb1a63677f6amike@reedtribe.org image = SkImage::NewRasterCopy(info, bm.getPixels(), bm.rowBytes()); 66889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com } 67889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com bm.unlockPixels(); 68889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com } 69889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com return image; 70889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com} 71889b09edfeb5f461ca283dfd08ee6b23560a7859reed@google.com 7270e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgstatic bool needs_layer(const SkPaint& paint) { 7370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org return 0xFF != paint.getAlpha() || 7470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org paint.getColorFilter() || 7570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org paint.getImageFilter() || 7670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode); 7770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org} 7870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org 7970e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.orgvoid SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture, 8070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org SkScalar x, SkScalar y, const SkPaint* paint) { 8170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org int saveCount = canvas->getSaveCount(); 82fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 8370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org if (paint && needs_layer(*paint)) { 8470e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org SkRect bounds; 8570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org bounds.set(x, y, 8670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org x + SkIntToScalar(picture->width()), 8770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org y + SkIntToScalar(picture->height())); 8870e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org canvas->saveLayer(&bounds, paint); 899ea5a3bc7361cb88d37280b5922fba9430fed328reed@google.com canvas->translate(x, y); 9070e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org } else if (x || y) { 9170e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org canvas->save(); 929ea5a3bc7361cb88d37280b5922fba9430fed328reed@google.com canvas->translate(x, y); 9370e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org } 94fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 9570e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org canvas->drawPicture(*picture); 9670e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org canvas->restoreToCount(saveCount); 9770e359055240d0de93da4ba71bf5833164fb394cmike@reedtribe.org} 98dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org 99dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.orgvoid SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture, 1007f1af501f206da48a7ff791af53432c9c1c89d08skia.committer@gmail.com const SkRect* src, const SkRect& dst, const SkPaint* paint) { 1017f1af501f206da48a7ff791af53432c9c1c89d08skia.committer@gmail.com int saveCount = canvas->getSaveCount(); 102dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org 103dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org SkMatrix matrix; 104dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org SkRect tmpSrc; 105dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org 106dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org if (NULL != src) { 107dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org tmpSrc = *src; 108dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org } else { 109dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org tmpSrc.set(0, 0, 110dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org SkIntToScalar(picture->width()), 111dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org SkIntToScalar(picture->height())); 112dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org } 113dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org 114dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org matrix.setRectToRect(tmpSrc, dst, SkMatrix::kFill_ScaleToFit); 115dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org if (paint && needs_layer(*paint)) { 116dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->saveLayer(&dst, paint); 117dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org } else { 118dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->save(); 119dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org } 120dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->concat(matrix); 121dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org if (!paint || !needs_layer(*paint)) { 122dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->clipRect(tmpSrc); 123dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org } 1247f1af501f206da48a7ff791af53432c9c1c89d08skia.committer@gmail.com 125dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->drawPicture(*picture); 126dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org canvas->restoreToCount(saveCount); 127dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org} 128