• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkBlitRow_DEFINED
9 #define SkBlitRow_DEFINED
10 
11 #include "SkBitmap.h"
12 #include "SkColor.h"
13 
14 class SkBlitRow {
15 public:
16     enum Flags16 {
17         //! If set, the alpha parameter will be != 255
18         kGlobalAlpha_Flag   = 0x01,
19         //! If set, the src colors may have alpha != 255
20         kSrcPixelAlpha_Flag = 0x02,
21         //! If set, the resulting 16bit colors should be dithered
22         kDither_Flag        = 0x04
23     };
24 
25     /** Function pointer that reads a scanline of src SkPMColors, and writes
26         a corresponding scanline of 16bit colors (specific format based on the
27         config passed to the Factory.
28 
29         The x,y params are useful just for dithering
30 
31         @param alpha A global alpha to be applied to all of the src colors
32         @param x The x coordinate of the beginning of the scanline
33         @param y THe y coordinate of the scanline
34      */
35     typedef void (*Proc)(uint16_t* dst,
36                          const SkPMColor* src,
37                          int count, U8CPU alpha, int x, int y);
38 
39     static Proc Factory(unsigned flags, SkBitmap::Config);
40 
41     ///////////// D32 version
42 
43     enum Flags32 {
44         kGlobalAlpha_Flag32     = 1 << 0,
45         kSrcPixelAlpha_Flag32   = 1 << 1
46     };
47 
48     /** Function pointer that blends 32bit colors onto a 32bit destination.
49         @param dst  array of dst 32bit colors
50         @param src  array of src 32bit colors (w/ or w/o alpha)
51         @param count number of colors to blend
52         @param alpha global alpha to be applied to all src colors
53      */
54     typedef void (*Proc32)(uint32_t* dst,
55                          const SkPMColor* src,
56                          int count, U8CPU alpha);
57 
58     static Proc32 Factory32(unsigned flags32);
59 
60    /** Function pointer that blends a single color with a row of 32-bit colors
61        onto a 32-bit destination
62    */
63    typedef void (*ColorProc)(SkPMColor* dst, const SkPMColor* src, int count,
64                              SkPMColor color);
65 
66     /** Blend a single color onto a row of S32 pixels, writing the result
67         into a row of D32 pixels. src and dst may be the same memory, but
68         if they are not, they may not overlap.
69      */
70     static void Color32(SkPMColor dst[], const SkPMColor src[],
71                         int count, SkPMColor color);
72 
73     //! Public entry-point to return a blit function ptr
74     static ColorProc ColorProcFactory();
75 
76     /** Function pointer that blends a single color onto a 32-bit rectangle.  */
77     typedef void (*ColorRectProc)(SkPMColor* dst, int width, int height,
78                                   size_t rowBytes, SkPMColor color);
79 
80     /** Blend a single color into a rectangle of D32 pixels. */
81     static void ColorRect32(SkPMColor* dst, int width, int height,
82                             size_t rowBytes, SkPMColor color);
83 
84     //! Public entry-point to return a blit function ptr
85     static ColorRectProc ColorRectProcFactory();
86 
87     /** These static functions are called by the Factory and Factory32
88         functions, and should return either NULL, or a
89         platform-specific function-ptr to be used in place of the
90         system default.
91      */
92 
93     static Proc32 PlatformProcs32(unsigned flags);
94     static Proc PlatformProcs565(unsigned flags);
95     static Proc PlatformProcs4444(unsigned flags);
96     static ColorProc PlatformColorProc();
97 
98 private:
99     enum {
100         kFlags16_Mask = 7,
101         kFlags32_Mask = 3
102     };
103 };
104 
105 #endif
106