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