15bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com/*
25bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Copyright 2011 Google Inc.
35bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com *
45bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Use of this source code is governed by a BSD-style license that can be
55bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * found in the LICENSE file.
65bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com */
77196a89544301e1f69c88dbce031b54cc5331ad9reed@google.com
81cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com#ifndef SkBlitRow_DEFINED
91cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com#define SkBlitRow_DEFINED
101cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
111cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com#include "SkBitmap.h"
121cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com#include "SkColor.h"
131cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
141cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.comclass SkBlitRow {
151cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.compublic:
161cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    enum Flags16 {
171cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        //! If set, the alpha parameter will be != 255
181cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        kGlobalAlpha_Flag   = 0x01,
191cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        //! If set, the src colors may have alpha != 255
201cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        kSrcPixelAlpha_Flag = 0x02,
211cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        //! If set, the resulting 16bit colors should be dithered
221cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        kDither_Flag        = 0x04
231cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    };
241cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
251cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    /** Function pointer that reads a scanline of src SkPMColors, and writes
261cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        a corresponding scanline of 16bit colors (specific format based on the
271cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        config passed to the Factory.
28c5bea4218fd5a6df52ff08c71c8d21eaf468e4d6reed@google.com
291cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        The x,y params are useful just for dithering
30c5bea4218fd5a6df52ff08c71c8d21eaf468e4d6reed@google.com
311cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        @param alpha A global alpha to be applied to all of the src colors
321cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        @param x The x coordinate of the beginning of the scanline
331cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        @param y THe y coordinate of the scanline
341cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com     */
352b24af4e83e0be9a842f09001ca1342dd2def857tomhudson@google.com    typedef void (*Proc)(uint16_t* dst,
362b24af4e83e0be9a842f09001ca1342dd2def857tomhudson@google.com                         const SkPMColor* src,
371cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com                         int count, U8CPU alpha, int x, int y);
381cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
391cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    static Proc Factory(unsigned flags, SkBitmap::Config);
401cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
411cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    ///////////// D32 version
421cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
431cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    enum Flags32 {
441cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        kGlobalAlpha_Flag32     = 1 << 0,
45e245d9e589f9c4c2339378dee7e79e808c7dbb81tomhudson@google.com        kSrcPixelAlpha_Flag32   = 1 << 1
461cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    };
471cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
481cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    /** Function pointer that blends 32bit colors onto a 32bit destination.
491cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        @param dst  array of dst 32bit colors
501cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        @param src  array of src 32bit colors (w/ or w/o alpha)
511cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        @param count number of colors to blend
521cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        @param alpha global alpha to be applied to all src colors
531cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com     */
542b24af4e83e0be9a842f09001ca1342dd2def857tomhudson@google.com    typedef void (*Proc32)(uint32_t* dst,
552b24af4e83e0be9a842f09001ca1342dd2def857tomhudson@google.com                         const SkPMColor* src,
561cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com                         int count, U8CPU alpha);
571cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
581cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    static Proc32 Factory32(unsigned flags32);
59c5bea4218fd5a6df52ff08c71c8d21eaf468e4d6reed@google.com
60222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com   /** Function pointer that blends a single color with a row of 32-bit colors
61222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com       onto a 32-bit destination
62222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com   */
63222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com   typedef void (*ColorProc)(SkPMColor* dst, const SkPMColor* src, int count,
64222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com                             SkPMColor color);
65222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com
661cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    /** Blend a single color onto a row of S32 pixels, writing the result
671cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        into a row of D32 pixels. src and dst may be the same memory, but
681cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        if they are not, they may not overlap.
691cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com     */
70c5bea4218fd5a6df52ff08c71c8d21eaf468e4d6reed@google.com    static void Color32(SkPMColor dst[], const SkPMColor src[],
71fc009eca2f26fecfb42e3cb1bd361c8aaa38cb0asenorblanco@chromium.org                        int count, SkPMColor color);
721cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
73222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com    //! Public entry-point to return a blit function ptr
74fc009eca2f26fecfb42e3cb1bd361c8aaa38cb0asenorblanco@chromium.org    static ColorProc ColorProcFactory();
751cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
76222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com    /** Function pointer that blends a single color onto a 32-bit rectangle.  */
77222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com    typedef void (*ColorRectProc)(SkPMColor* dst, int width, int height,
78222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com                                  size_t rowBytes, SkPMColor color);
79222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com
80222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com    /** Blend a single color into a rectangle of D32 pixels. */
81222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com    static void ColorRect32(SkPMColor* dst, int width, int height,
82222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com                            size_t rowBytes, SkPMColor color);
83222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com
84222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com    //! Public entry-point to return a blit function ptr
85222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com    static ColorRectProc ColorRectProcFactory();
86222585f46462b1734014c2d591120fa1dcfa6ec5tomhudson@google.com
87ee959b4f7cd261487364aa2462c401c0eb24b5efsenorblanco@chromium.org    /** These static functions are called by the Factory and Factory32
88ee959b4f7cd261487364aa2462c401c0eb24b5efsenorblanco@chromium.org        functions, and should return either NULL, or a
89ee959b4f7cd261487364aa2462c401c0eb24b5efsenorblanco@chromium.org        platform-specific function-ptr to be used in place of the
90ee959b4f7cd261487364aa2462c401c0eb24b5efsenorblanco@chromium.org        system default.
91ee959b4f7cd261487364aa2462c401c0eb24b5efsenorblanco@chromium.org     */
92ee959b4f7cd261487364aa2462c401c0eb24b5efsenorblanco@chromium.org
93d7042ee400be1f6414bea8e7d94bff4a10e6c9fereed@android.com    static Proc32 PlatformProcs32(unsigned flags);
94d7042ee400be1f6414bea8e7d94bff4a10e6c9fereed@android.com    static Proc PlatformProcs565(unsigned flags);
95c004064c5389f4bfa09c46da3b4667f9db74796fsenorblanco@chromium.org    static ColorProc PlatformColorProc();
96ee959b4f7cd261487364aa2462c401c0eb24b5efsenorblanco@chromium.org
971cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.comprivate:
981cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    enum {
991cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        kFlags16_Mask = 7,
1001cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com        kFlags32_Mask = 3
1011cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com    };
1021cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com};
1031cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com
1041cf17d78fbaace76a5239bcaa1d3119a147e99f1reed@android.com#endif
105