1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2011 Google Inc. 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkCanvas.h" 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkColorPriv.h" 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/** 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Converts pixels from one Config8888 to another Config8888 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkConvertConfig8888Pixels(uint32_t* dstPixels, 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t dstRowBytes, 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkCanvas::Config8888 dstConfig, 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const uint32_t* srcPixels, 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t srcRowBytes, 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkCanvas::Config8888 srcConfig, 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int width, 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int height); 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/** 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Packs a, r, g, b, values into byte order specified by config. 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergeruint32_t SkPackConfig8888(SkCanvas::Config8888 config, 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger uint32_t a, 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger uint32_t r, 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger uint32_t g, 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger uint32_t b); 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergernamespace { 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/** 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Copies all pixels from a bitmap to a dst ptr with a given rowBytes and 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Config8888. The bitmap must have kARGB_8888_Config. 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerinline void SkCopyBitmapToConfig8888(uint32_t* dstPixels, 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t dstRowBytes, 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkCanvas::Config8888 dstConfig8888, 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkBitmap& srcBmp); 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/** 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Copies over all pixels in a bitmap from a src ptr with a given rowBytes and 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Config8888. The bitmap must have pixels and be kARGB_8888_Config. 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerinline void SkCopyConfig8888ToBitmap(const SkBitmap& dstBmp, 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const uint32_t* srcPixels, 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t srcRowBytes, 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkCanvas::Config8888 srcConfig8888); 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger// Implementation 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergernamespace { 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerinline void SkCopyBitmapToConfig8888(uint32_t* dstPixels, 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t dstRowBytes, 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkCanvas::Config8888 dstConfig8888, 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkBitmap& srcBmp) { 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(SkBitmap::kARGB_8888_Config == srcBmp.config()); 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAutoLockPixels alp(srcBmp); 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int w = srcBmp.width(); 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int h = srcBmp.height(); 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t srcRowBytes = srcBmp.rowBytes(); 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const uint32_t* srcPixels = reinterpret_cast<uint32_t*>(srcBmp.getPixels()); 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkConvertConfig8888Pixels(dstPixels, dstRowBytes, dstConfig8888, srcPixels, srcRowBytes, SkCanvas::kNative_Premul_Config8888, w, h); 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerinline void SkCopyConfig8888ToBitmap(const SkBitmap& dstBmp, 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const uint32_t* srcPixels, 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t srcRowBytes, 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkCanvas::Config8888 srcConfig8888) { 79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(SkBitmap::kARGB_8888_Config == dstBmp.config()); 80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAutoLockPixels alp(dstBmp); 81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int w = dstBmp.width(); 82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int h = dstBmp.height(); 83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t dstRowBytes = dstBmp.rowBytes(); 84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger uint32_t* dstPixels = reinterpret_cast<uint32_t*>(dstBmp.getPixels()); 85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkConvertConfig8888Pixels(dstPixels, dstRowBytes, SkCanvas::kNative_Premul_Config8888, srcPixels, srcRowBytes, srcConfig8888, w, h); 87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 90