18317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein/*
28317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein * Copyright 2015 Google Inc.
38317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein *
48317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein * Use of this source code is governed by a BSD-style license that can be
58317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein * found in the LICENSE file.
68317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein */
78317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein
88317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein#ifndef SkOpts_DEFINED
98317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein#define SkOpts_DEFINED
108317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein
11baaf8ad95237d1defdb7d93077d9bf8410d8ad7fMike Klein#include "SkRasterPipeline.h"
128317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein#include "SkTypes.h"
13d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed#include "SkXfermodePriv.h"
14490b61569d27c9b7ba164fbc4394994d2e7cb022mtklein
15490b61569d27c9b7ba164fbc4394994d2e7cb022mtkleinstruct ProcCoeff;
168317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein
178317a1832f55e175531ee7ae7ccd12a3a15e3c75mtkleinnamespace SkOpts {
188317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein    // Call to replace pointers to portable functions with pointers to CPU-specific functions.
198317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein    // Thread-safe and idempotent.
2005db63b5fc262136da9b289418b871180cd1359bmtklein    // Called by SkGraphics::Init().
218317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein    void Init();
228317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein
23f684a78d9ea988883c9b2c7bcc4ea4d5e68bd998mtklein    // Declare function pointers here...
24f684a78d9ea988883c9b2c7bcc4ea4d5e68bd998mtklein
25490b61569d27c9b7ba164fbc4394994d2e7cb022mtklein    // May return nullptr if we haven't specialized the given Mode.
26ce9514c6cd91c7225ec0d7ccfffd1d964cb1ac6aMike Reed    extern SkXfermode* (*create_xfermode)(SkBlendMode);
27dce5ce4276e2825efc6d8c4daa819c965794cd12mtklein
28d029ded92d409a004f2096c78f5a99b524206481mtklein    typedef void (*Morph)(const SkPMColor*, SkPMColor*, int, int, int, int, int);
29d029ded92d409a004f2096c78f5a99b524206481mtklein    extern Morph dilate_x, dilate_y, erode_x, erode_y;
30b6394746ff546a9c60d68e3be162cb38feffa803mtklein
314977983510028712528743aa877f6da83781b381mtklein    extern void (*blit_mask_d32_a8)(SkPMColor*, size_t, const SkAlpha*, size_t, SkColor, int, int);
324a37d08382a16717cde52c3d2687b021c5413464mtklein    extern void (*blit_row_color32)(SkPMColor*, const SkPMColor*, int, SkPMColor);
33b4a7dc99b1a01cdd5c0cd5913b630436ca696210mtklein    extern void (*blit_row_s32a_opaque)(SkPMColor*, const SkPMColor*, int, U8CPU);
342d141ba2df8f7506848aa9369f502944e837cd09mtklein
358bf7b79cf9776b4edb3f6810e5ab8c80c49d3480mtklein    // Swizzle input into some sort of 8888 pixel, {premul,unpremul} x {rgba,bgra}.
368bf7b79cf9776b4edb3f6810e5ab8c80c49d3480mtklein    typedef void (*Swizzle_8888)(uint32_t*, const void*, int);
37c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett    extern Swizzle_8888 RGBA_to_BGRA,          // i.e. just swap RB
38c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        RGBA_to_rgbA,          // i.e. just premultiply
39c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        RGBA_to_bgrA,          // i.e. swap RB and premultiply
40c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        RGB_to_RGB1,           // i.e. insert an opaque alpha
41c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        RGB_to_BGR1,           // i.e. swap RB and insert an opaque alpha
42c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        gray_to_RGB1,          // i.e. expand to color channels + an opaque alpha
43c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        grayA_to_RGBA,         // i.e. expand to color channels
44c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        grayA_to_rgbA,         // i.e. expand to color channels and premultiply
45c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        inverted_CMYK_to_RGB1, // i.e. convert color space
46c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarett                        inverted_CMYK_to_BGR1; // i.e. convert color space
47a525cb151bb39fb6362af051f69b6d633f660fd9mtklein
4887db00111596d432908882a13982adde79793a7cMike Klein    extern void (*memset16)(uint16_t[], uint16_t, int);
492fbf1bc8c96f749a4c098bcfc827053445c2e12dDerek Sollenberger    extern void SK_API (*memset32)(uint32_t[], uint32_t, int);
5087db00111596d432908882a13982adde79793a7cMike Klein    extern void (*memset64)(uint64_t[], uint64_t, int);
5187db00111596d432908882a13982adde79793a7cMike Klein
524e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein    // The fastest high quality 32-bit hash we can provide on this platform.
534e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein    extern uint32_t (*hash_fn)(const void*, size_t, uint32_t seed);
544e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein    static inline uint32_t hash(const void* data, size_t bytes, uint32_t seed=0) {
554e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein        return hash_fn(data, bytes, seed);
564e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein    }
578317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein}
588317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein
598317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein#endif//SkOpts_DEFINED
60