1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 758af9a64701540c7f8083bc22a42d0bae3a5583creed@google.com 8c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com#include "SkBlitRow.h" 958af9a64701540c7f8083bc22a42d0bae3a5583creed@google.com#include "SkBlitMask.h" 10c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com#include "SkColorPriv.h" 11c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com#include "SkUtils.h" 12c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 1357f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#define UNROLL 1457f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com 158dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.comSkBlitRow::ColorRectProc PlatformColorRectProcFactory(); 168dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com 17c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.comstatic void S32_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst, 18c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com const SkPMColor* SK_RESTRICT src, 19c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com int count, U8CPU alpha) { 20c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com SkASSERT(255 == alpha); 21f0ea77a3630e6d1c01d83aa5430b3780da9e88b6commit-bot@chromium.org sk_memcpy32(dst, src, count); 22c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com} 23c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 24c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.comstatic void S32_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, 25c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com const SkPMColor* SK_RESTRICT src, 26c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com int count, U8CPU alpha) { 27c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com SkASSERT(alpha <= 255); 28c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (count > 0) { 29c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com unsigned src_scale = SkAlpha255To256(alpha); 30c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com unsigned dst_scale = 256 - src_scale; 3157f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com 3257f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#ifdef UNROLL 3357f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com if (count & 1) { 3457f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkAlphaMulQ(*(src++), src_scale) + SkAlphaMulQ(*dst, dst_scale); 3557f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 3657f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com count -= 1; 3757f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com } 3857f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com 3957f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com const SkPMColor* SK_RESTRICT srcEnd = src + count; 4057f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com while (src != srcEnd) { 4157f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkAlphaMulQ(*(src++), src_scale) + SkAlphaMulQ(*dst, dst_scale); 4257f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 4357f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkAlphaMulQ(*(src++), src_scale) + SkAlphaMulQ(*dst, dst_scale); 4457f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 4557f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com } 4657f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#else 47c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com do { 48c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com *dst = SkAlphaMulQ(*src, src_scale) + SkAlphaMulQ(*dst, dst_scale); 49c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com src += 1; 50c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com dst += 1; 51c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } while (--count > 0); 5257f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#endif 53c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 54c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com} 55c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 56c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.comstatic void S32A_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst, 57c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com const SkPMColor* SK_RESTRICT src, 58c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com int count, U8CPU alpha) { 59c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com SkASSERT(255 == alpha); 60c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (count > 0) { 6157f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#ifdef UNROLL 6257f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com if (count & 1) { 6357f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkPMSrcOver(*(src++), *dst); 6457f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 6557f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com count -= 1; 6657f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com } 6757f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com 6857f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com const SkPMColor* SK_RESTRICT srcEnd = src + count; 6957f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com while (src != srcEnd) { 7057f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkPMSrcOver(*(src++), *dst); 7157f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 7257f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkPMSrcOver(*(src++), *dst); 7357f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 7457f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com } 7557f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#else 76c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com do { 77c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com *dst = SkPMSrcOver(*src, *dst); 78c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com src += 1; 79c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com dst += 1; 80c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } while (--count > 0); 8157f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#endif 82c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 83c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com} 84c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 85c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.comstatic void S32A_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, 86c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com const SkPMColor* SK_RESTRICT src, 87c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com int count, U8CPU alpha) { 88c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com SkASSERT(alpha <= 255); 89c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (count > 0) { 9057f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#ifdef UNROLL 9157f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com if (count & 1) { 9257f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkBlendARGB32(*(src++), *dst, alpha); 9357f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 9457f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com count -= 1; 9557f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com } 9657f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com 9757f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com const SkPMColor* SK_RESTRICT srcEnd = src + count; 9857f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com while (src != srcEnd) { 9957f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkBlendARGB32(*(src++), *dst, alpha); 10057f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 10157f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com *dst = SkBlendARGB32(*(src++), *dst, alpha); 10257f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com dst += 1; 10357f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com } 10457f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#else 105c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com do { 106c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com *dst = SkBlendARGB32(*src, *dst, alpha); 107c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com src += 1; 108c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com dst += 1; 109c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } while (--count > 0); 11057f4969724a1dd88c8d9ae35a863e6cf621181d5djsollen@google.com#endif 111c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 112c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com} 113c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 114c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com/////////////////////////////////////////////////////////////////////////////// 115c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 116c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.comstatic const SkBlitRow::Proc32 gDefault_Procs32[] = { 117c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com S32_Opaque_BlitRow32, 118c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com S32_Blend_BlitRow32, 119c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com S32A_Opaque_BlitRow32, 120c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com S32A_Blend_BlitRow32 121c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com}; 122c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 123c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.comSkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) { 124c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com SkASSERT(flags < SK_ARRAY_COUNT(gDefault_Procs32)); 125c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com // just so we don't crash 126c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com flags &= kFlags32_Mask; 127981d4798007b91e2e19c13b171583927a56df63breed@google.com 1289272761b22746d2d22439c26f5555028f8e824dasenorblanco@chromium.org SkBlitRow::Proc32 proc = PlatformProcs32(flags); 129c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (NULL == proc) { 130c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com proc = gDefault_Procs32[flags]; 131c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 132c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com SkASSERT(proc); 133c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com return proc; 134c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com} 135c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 13629e5054dd07c97c2195c5f64bf67aaa6b5afa204senorblanco@chromium.orgSkBlitRow::Proc32 SkBlitRow::ColorProcFactory() { 137c3856384e4ab9a7ad5902696a5c972ab595b8467senorblanco@chromium.org SkBlitRow::ColorProc proc = PlatformColorProc(); 138c3856384e4ab9a7ad5902696a5c972ab595b8467senorblanco@chromium.org if (NULL == proc) { 13929e5054dd07c97c2195c5f64bf67aaa6b5afa204senorblanco@chromium.org proc = Color32; 140c3856384e4ab9a7ad5902696a5c972ab595b8467senorblanco@chromium.org } 14129e5054dd07c97c2195c5f64bf67aaa6b5afa204senorblanco@chromium.org SkASSERT(proc); 14229e5054dd07c97c2195c5f64bf67aaa6b5afa204senorblanco@chromium.org return proc; 143c3856384e4ab9a7ad5902696a5c972ab595b8467senorblanco@chromium.org} 144c3856384e4ab9a7ad5902696a5c972ab595b8467senorblanco@chromium.org 145f2068adc2c4123075a17bf838171e498584312b3reed@google.comvoid SkBlitRow::Color32(SkPMColor* SK_RESTRICT dst, 146f2068adc2c4123075a17bf838171e498584312b3reed@google.com const SkPMColor* SK_RESTRICT src, 14729e5054dd07c97c2195c5f64bf67aaa6b5afa204senorblanco@chromium.org int count, SkPMColor color) { 148c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (count > 0) { 149c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (0 == color) { 150c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (src != dst) { 151c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com memcpy(dst, src, count * sizeof(SkPMColor)); 152c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 153c909a1ecadd422d91ff97d10ce08865290223b14reed@google.com return; 154c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 155c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com unsigned colorA = SkGetPackedA32(color); 156c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com if (255 == colorA) { 157c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com sk_memset32(dst, color, count); 158c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } else { 159c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com unsigned scale = 256 - SkAlpha255To256(colorA); 160c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com do { 161c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com *dst = color + SkAlphaMulQ(*src, scale); 162c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com src += 1; 163c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com dst += 1; 164c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } while (--count); 165c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 166c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com } 167c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com} 168c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com 1699f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.comtemplate <size_t N> void assignLoop(SkPMColor* dst, SkPMColor color) { 1709f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com for (size_t i = 0; i < N; ++i) { 1719f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1729f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 1739f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com} 1749f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com 1759f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.comstatic inline void assignLoop(SkPMColor dst[], SkPMColor color, int count) { 1769f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com while (count >= 4) { 1779f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1789f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1799f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1809f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1819f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com count -= 4; 1829f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 1839f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com if (count >= 2) { 1849f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1859f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1869f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com count -= 2; 1879f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 1889f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com if (count > 0) { 1899f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com *dst++ = color; 1909f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 1919f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com} 1929f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com 1938dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.comvoid SkBlitRow::ColorRect32(SkPMColor* dst, int width, int height, 1948dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com size_t rowBytes, SkPMColor color) { 1959f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com if (width <= 0 || height <= 0 || 0 == color) { 1969f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com return; 1979f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 1989f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com 1999f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com // Just made up this value, since I saw it once in a SSE2 file. 2009f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com // We should consider writing some tests to find the optimimal break-point 2019f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com // (or query the Platform proc?) 2029f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com static const int MIN_WIDTH_FOR_SCANLINE_PROC = 32; 2039f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com 2049f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com bool isOpaque = (0xFF == SkGetPackedA32(color)); 2059f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com 2069f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com if (!isOpaque || width >= MIN_WIDTH_FOR_SCANLINE_PROC) { 2079f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com SkBlitRow::ColorProc proc = SkBlitRow::ColorProcFactory(); 2089f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com while (--height >= 0) { 2099f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com (*proc)(dst, dst, width, color); 2109f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com dst = (SkPMColor*) ((char*)dst + rowBytes); 2119f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 2129f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } else { 2139f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com switch (width) { 2149f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com case 1: 2159f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com while (--height >= 0) { 2169f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com assignLoop<1>(dst, color); 2179f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com dst = (SkPMColor*) ((char*)dst + rowBytes); 2189f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 2199f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com break; 2209f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com case 2: 2219f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com while (--height >= 0) { 2229f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com assignLoop<2>(dst, color); 2239f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com dst = (SkPMColor*) ((char*)dst + rowBytes); 2249f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 2259f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com break; 2269f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com case 3: 2279f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com while (--height >= 0) { 2289f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com assignLoop<3>(dst, color); 2299f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com dst = (SkPMColor*) ((char*)dst + rowBytes); 2309f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 2319f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com break; 2329f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com default: 2339f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com while (--height >= 0) { 2349f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com assignLoop(dst, color, width); 2359f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com dst = (SkPMColor*) ((char*)dst + rowBytes); 2369f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 2379f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com break; 2389f63667ff221b72e96fa6a044ccb0dde12af6ebereed@google.com } 2398dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com } 2408dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com} 2418dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com 2428dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.comSkBlitRow::ColorRectProc SkBlitRow::ColorRectProcFactory() { 2438dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com SkBlitRow::ColorRectProc proc = PlatformColorRectProcFactory(); 2448dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com if (NULL == proc) { 2458dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com proc = ColorRect32; 2468dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com } 2478dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com SkASSERT(proc); 2488dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com return proc; 2498dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com} 250