blob: e32d35e20d9f00a1ec4850fda461dc6a27473c15 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
10#ifndef SkBitmapProcShader_DEFINED
11#define SkBitmapProcShader_DEFINED
12
13#include "SkShader.h"
14#include "SkBitmapProcState.h"
commit-bot@chromium.orga5572e52014-03-07 03:24:41 +000015#include "SkSmallAllocator.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016
17class SkBitmapProcShader : public SkShader {
18public:
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000019 SkBitmapProcShader(const SkBitmap& src, TileMode tx, TileMode ty,
20 const SkMatrix* localMatrix = NULL);
reed@android.com8a1c16f2008-12-17 15:59:43 +000021
22 // overrides from SkShader
junov@chromium.orgb6e16192011-12-09 15:48:03 +000023 virtual bool isOpaque() const SK_OVERRIDE;
robertphillips@google.com76f9e932013-01-15 20:17:47 +000024 virtual BitmapType asABitmap(SkBitmap*, SkMatrix*, TileMode*) const SK_OVERRIDE;
reed@android.com8a1c16f2008-12-17 15:59:43 +000025
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +000026 virtual bool validContext(const ContextRec&, SkMatrix* totalInverse) const SK_OVERRIDE;
27 virtual SkShader::Context* createContext(const ContextRec&, void* storage) const SK_OVERRIDE;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000028 virtual size_t contextSize() const SK_OVERRIDE;
29
reed@android.com8a1c16f2008-12-17 15:59:43 +000030 static bool CanDo(const SkBitmap&, TileMode tx, TileMode ty);
skia.committer@gmail.comff21c2e2013-01-16 07:05:56 +000031
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000032 SK_TO_STRING_OVERRIDE()
djsollen@google.comba28d032012-03-26 17:57:35 +000033 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapProcShader)
reed@android.com8a1c16f2008-12-17 15:59:43 +000034
bsalomon@google.come197cbf2013-01-14 16:46:26 +000035#if SK_SUPPORT_GPU
bsalomon@google.com0ac6af42013-01-16 15:16:18 +000036 GrEffectRef* asNewEffect(GrContext*, const SkPaint&) const SK_OVERRIDE;
bsalomon@google.come197cbf2013-01-14 16:46:26 +000037#endif
38
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000039 class BitmapProcShaderContext : public SkShader::Context {
40 public:
41 // The context takes ownership of the state. It will call its destructor
42 // but will NOT free the memory.
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +000043 BitmapProcShaderContext(const SkBitmapProcShader&, const ContextRec&, SkBitmapProcState*);
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000044 virtual ~BitmapProcShaderContext();
45
46 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE;
47 virtual ShadeProc asAShadeProc(void** ctx) SK_OVERRIDE;
48 virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) SK_OVERRIDE;
49
50 virtual uint32_t getFlags() const SK_OVERRIDE { return fFlags; }
51
52 private:
53 SkBitmapProcState* fState;
54 uint32_t fFlags;
55
56 typedef SkShader::Context INHERITED;
57 };
58
reed@android.com8a1c16f2008-12-17 15:59:43 +000059protected:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000060 SkBitmapProcShader(SkReadBuffer& );
61 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
reed@android.com8a1c16f2008-12-17 15:59:43 +000062
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000063 SkBitmap fRawBitmap; // experimental for RLE encoding
64 uint8_t fTileModeX, fTileModeY;
reed@android.com8a1c16f2008-12-17 15:59:43 +000065
reed@google.com7c2f27d2011-03-07 19:29:00 +000066private:
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +000067 bool validInternal(const ContextRec&, SkMatrix* totalInverse, SkBitmapProcState*) const;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000068
reed@android.com8a1c16f2008-12-17 15:59:43 +000069 typedef SkShader INHERITED;
70};
71
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000072// Commonly used allocator. It currently is only used to allocate up to 3 objects. The total
73// bytes requested is calculated using one of our large shaders, its context size plus the size of
74// an Sk3DBlitter in SkDraw.cpp
75// Note that some contexts may contain other contexts (e.g. for compose shaders), but we've not
76// yet found a situation where the size below isn't big enough.
77typedef SkSmallAllocator<3, sizeof(SkBitmapProcShader) +
78 sizeof(SkBitmapProcShader::BitmapProcShaderContext) +
79 sizeof(SkBitmapProcState) +
80 sizeof(void*) * 2> SkTBlitterAllocator;
commit-bot@chromium.orga5572e52014-03-07 03:24:41 +000081
82// If alloc is non-NULL, it will be used to allocate the returned SkShader, and MUST outlive
83// the SkShader.
84SkShader* CreateBitmapShader(const SkBitmap& src, SkShader::TileMode, SkShader::TileMode,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000085 const SkMatrix* localMatrix, SkTBlitterAllocator* alloc);
commit-bot@chromium.orga5572e52014-03-07 03:24:41 +000086
reed@android.com8a1c16f2008-12-17 15:59:43 +000087#endif