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