1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/image/SkImagePriv.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,127 @@ 1.4 +/* 1.5 + * Copyright 2012 Google Inc. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license that can be 1.8 + * found in the LICENSE file. 1.9 + */ 1.10 + 1.11 +#include "SkImagePriv.h" 1.12 +#include "SkCanvas.h" 1.13 +#include "SkPicture.h" 1.14 + 1.15 +SkBitmap::Config SkColorTypeToBitmapConfig(SkColorType colorType) { 1.16 + switch (colorType) { 1.17 + case kAlpha_8_SkColorType: 1.18 + return SkBitmap::kA8_Config; 1.19 + 1.20 + case kARGB_4444_SkColorType: 1.21 + return SkBitmap::kARGB_4444_Config; 1.22 + 1.23 + case kRGB_565_SkColorType: 1.24 + return SkBitmap::kRGB_565_Config; 1.25 + 1.26 + case kPMColor_SkColorType: 1.27 + return SkBitmap::kARGB_8888_Config; 1.28 + 1.29 + case kIndex_8_SkColorType: 1.30 + return SkBitmap::kIndex8_Config; 1.31 + 1.32 + default: 1.33 + // break for unsupported colortypes 1.34 + break; 1.35 + } 1.36 + return SkBitmap::kNo_Config; 1.37 +} 1.38 + 1.39 +SkBitmap::Config SkImageInfoToBitmapConfig(const SkImageInfo& info) { 1.40 + return SkColorTypeToBitmapConfig(info.fColorType); 1.41 +} 1.42 + 1.43 +SkColorType SkBitmapConfigToColorType(SkBitmap::Config config) { 1.44 + static const SkColorType gCT[] = { 1.45 + kUnknown_SkColorType, // kNo_Config 1.46 + kAlpha_8_SkColorType, // kA8_Config 1.47 + kIndex_8_SkColorType, // kIndex8_Config 1.48 + kRGB_565_SkColorType, // kRGB_565_Config 1.49 + kARGB_4444_SkColorType, // kARGB_4444_Config 1.50 + kPMColor_SkColorType, // kARGB_8888_Config 1.51 + }; 1.52 + SkASSERT((unsigned)config < SK_ARRAY_COUNT(gCT)); 1.53 + return gCT[config]; 1.54 +} 1.55 + 1.56 +SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef) { 1.57 + SkImageInfo info; 1.58 + if (!bm.asImageInfo(&info)) { 1.59 + return NULL; 1.60 + } 1.61 + 1.62 + SkImage* image = NULL; 1.63 + if (canSharePixelRef || bm.isImmutable()) { 1.64 + image = SkNewImageFromPixelRef(info, bm.pixelRef(), bm.rowBytes()); 1.65 + } else { 1.66 + bm.lockPixels(); 1.67 + if (bm.getPixels()) { 1.68 + image = SkImage::NewRasterCopy(info, bm.getPixels(), bm.rowBytes()); 1.69 + } 1.70 + bm.unlockPixels(); 1.71 + } 1.72 + return image; 1.73 +} 1.74 + 1.75 +static bool needs_layer(const SkPaint& paint) { 1.76 + return 0xFF != paint.getAlpha() || 1.77 + paint.getColorFilter() || 1.78 + paint.getImageFilter() || 1.79 + SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode); 1.80 +} 1.81 + 1.82 +void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture, 1.83 + SkScalar x, SkScalar y, const SkPaint* paint) { 1.84 + int saveCount = canvas->getSaveCount(); 1.85 + 1.86 + if (paint && needs_layer(*paint)) { 1.87 + SkRect bounds; 1.88 + bounds.set(x, y, 1.89 + x + SkIntToScalar(picture->width()), 1.90 + y + SkIntToScalar(picture->height())); 1.91 + canvas->saveLayer(&bounds, paint); 1.92 + canvas->translate(x, y); 1.93 + } else if (x || y) { 1.94 + canvas->save(); 1.95 + canvas->translate(x, y); 1.96 + } 1.97 + 1.98 + canvas->drawPicture(*picture); 1.99 + canvas->restoreToCount(saveCount); 1.100 +} 1.101 + 1.102 +void SkImagePrivDrawPicture(SkCanvas* canvas, SkPicture* picture, 1.103 + const SkRect* src, const SkRect& dst, const SkPaint* paint) { 1.104 + int saveCount = canvas->getSaveCount(); 1.105 + 1.106 + SkMatrix matrix; 1.107 + SkRect tmpSrc; 1.108 + 1.109 + if (NULL != src) { 1.110 + tmpSrc = *src; 1.111 + } else { 1.112 + tmpSrc.set(0, 0, 1.113 + SkIntToScalar(picture->width()), 1.114 + SkIntToScalar(picture->height())); 1.115 + } 1.116 + 1.117 + matrix.setRectToRect(tmpSrc, dst, SkMatrix::kFill_ScaleToFit); 1.118 + if (paint && needs_layer(*paint)) { 1.119 + canvas->saveLayer(&dst, paint); 1.120 + } else { 1.121 + canvas->save(); 1.122 + } 1.123 + canvas->concat(matrix); 1.124 + if (!paint || !needs_layer(*paint)) { 1.125 + canvas->clipRect(tmpSrc); 1.126 + } 1.127 + 1.128 + canvas->drawPicture(*picture); 1.129 + canvas->restoreToCount(saveCount); 1.130 +}