Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 /*
2 * Copyright 2008 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
8 #ifndef SkPixelRef_DEFINED
9 #define SkPixelRef_DEFINED
11 #include "SkBitmap.h"
12 #include "SkRefCnt.h"
13 #include "SkString.h"
14 #include "SkFlattenable.h"
15 #include "SkImageInfo.h"
16 #include "SkTDArray.h"
18 //#define xed
20 #ifdef SK_DEBUG
21 /**
22 * Defining SK_IGNORE_PIXELREF_SETPRELOCKED will force all pixelref
23 * subclasses to correctly handle lock/unlock pixels. For performance
24 * reasons, simple malloc-based subclasses call setPreLocked() to skip
25 * the overhead of implementing these calls.
26 *
27 * This build-flag disables that optimization, to add in debugging our
28 * call-sites, to ensure that they correctly balance their calls of
29 * lock and unlock.
30 */
31 // #define SK_IGNORE_PIXELREF_SETPRELOCKED
32 #endif
34 class SkColorTable;
35 class SkData;
36 struct SkIRect;
37 class SkMutex;
39 class GrTexture;
41 /** \class SkPixelRef
43 This class is the smart container for pixel memory, and is used with
44 SkBitmap. A pixelref is installed into a bitmap, and then the bitmap can
45 access the actual pixel memory by calling lockPixels/unlockPixels.
47 This class can be shared/accessed between multiple threads.
48 */
49 class SK_API SkPixelRef : public SkFlattenable {
50 public:
51 SK_DECLARE_INST_COUNT(SkPixelRef)
53 explicit SkPixelRef(const SkImageInfo&);
54 SkPixelRef(const SkImageInfo&, SkBaseMutex* mutex);
55 virtual ~SkPixelRef();
57 const SkImageInfo& info() const {
58 return fInfo;
59 }
61 /** Return the pixel memory returned from lockPixels, or null if the
62 lockCount is 0.
63 */
64 void* pixels() const { return fRec.fPixels; }
66 /** Return the current colorTable (if any) if pixels are locked, or null.
67 */
68 SkColorTable* colorTable() const { return fRec.fColorTable; }
70 size_t rowBytes() const { return fRec.fRowBytes; }
72 /**
73 * To access the actual pixels of a pixelref, it must be "locked".
74 * Calling lockPixels returns a LockRec struct (on success).
75 */
76 struct LockRec {
77 void* fPixels;
78 SkColorTable* fColorTable;
79 size_t fRowBytes;
81 void zero() { sk_bzero(this, sizeof(*this)); }
83 bool isZero() const {
84 return NULL == fPixels && NULL == fColorTable && 0 == fRowBytes;
85 }
86 };
88 /**
89 * Returns true if the lockcount > 0
90 */
91 bool isLocked() const { return fLockCount > 0; }
93 SkDEBUGCODE(int getLockCount() const { return fLockCount; })
95 /**
96 * Call to access the pixel memory. Return true on success. Balance this
97 * with a call to unlockPixels().
98 */
99 bool lockPixels();
101 /**
102 * Call to access the pixel memory. On success, return true and fill out
103 * the specified rec. On failure, return false and ignore the rec parameter.
104 * Balance this with a call to unlockPixels().
105 */
106 bool lockPixels(LockRec* rec);
108 /** Call to balanace a previous call to lockPixels(). Returns the pixels
109 (or null) after the unlock. NOTE: lock calls can be nested, but the
110 matching number of unlock calls must be made in order to free the
111 memory (if the subclass implements caching/deferred-decoding.)
112 */
113 void unlockPixels();
115 /**
116 * Some bitmaps can return a copy of their pixels for lockPixels(), but
117 * that copy, if modified, will not be pushed back. These bitmaps should
118 * not be used as targets for a raster device/canvas (since all pixels
119 * modifications will be lost when unlockPixels() is called.)
120 */
121 bool lockPixelsAreWritable() const;
123 /** Returns a non-zero, unique value corresponding to the pixels in this
124 pixelref. Each time the pixels are changed (and notifyPixelsChanged is
125 called), a different generation ID will be returned.
126 */
127 uint32_t getGenerationID() const;
129 /**
130 * Call this if you have changed the contents of the pixels. This will in-
131 * turn cause a different generation ID value to be returned from
132 * getGenerationID().
133 */
134 void notifyPixelsChanged();
136 /**
137 * Change the info's AlphaType. Note that this does not automatically
138 * invalidate the generation ID. If the pixel values themselves have
139 * changed, then you must explicitly call notifyPixelsChanged() as well.
140 */
141 void changeAlphaType(SkAlphaType at);
143 /** Returns true if this pixelref is marked as immutable, meaning that the
144 contents of its pixels will not change for the lifetime of the pixelref.
145 */
146 bool isImmutable() const { return fIsImmutable; }
148 /** Marks this pixelref is immutable, meaning that the contents of its
149 pixels will not change for the lifetime of the pixelref. This state can
150 be set on a pixelref, but it cannot be cleared once it is set.
151 */
152 void setImmutable();
154 /** Return the optional URI string associated with this pixelref. May be
155 null.
156 */
157 const char* getURI() const { return fURI.size() ? fURI.c_str() : NULL; }
159 /** Copy a URI string to this pixelref, or clear the URI if the uri is null
160 */
161 void setURI(const char uri[]) {
162 fURI.set(uri);
163 }
165 /** Copy a URI string to this pixelref
166 */
167 void setURI(const char uri[], size_t len) {
168 fURI.set(uri, len);
169 }
171 /** Assign a URI string to this pixelref.
172 */
173 void setURI(const SkString& uri) { fURI = uri; }
175 /**
176 * If the pixelRef has an encoded (i.e. compressed) representation,
177 * return a ref to its data. If the pixelRef
178 * is uncompressed or otherwise does not have this form, return NULL.
179 *
180 * If non-null is returned, the caller is responsible for calling unref()
181 * on the data when it is finished.
182 */
183 SkData* refEncodedData() {
184 return this->onRefEncodedData();
185 }
187 /**
188 * Experimental -- tells the caller if it is worth it to call decodeInto().
189 * Just an optimization at this point, to avoid checking the cache first.
190 * We may remove/change this call in the future.
191 */
192 bool implementsDecodeInto() {
193 return this->onImplementsDecodeInto();
194 }
196 /**
197 * Return a decoded instance of this pixelRef in bitmap. If this cannot be
198 * done, return false and the bitmap parameter is ignored/unchanged.
199 *
200 * pow2 is the requeste power-of-two downscale that the caller needs. This
201 * can be ignored, and the "original" size can be returned, but if the
202 * underlying codec can efficiently return a smaller size, that should be
203 * done. Some examples:
204 *
205 * To request the "base" version (original scale), pass 0 for pow2
206 * To request 1/2 scale version (1/2 width, 1/2 height), pass 1 for pow2
207 * To request 1/4 scale version (1/4 width, 1/4 height), pass 2 for pow2
208 * ...
209 *
210 * If this returns true, then bitmap must be "locked" such that
211 * bitmap->getPixels() will return the correct address.
212 */
213 bool decodeInto(int pow2, SkBitmap* bitmap) {
214 SkASSERT(pow2 >= 0);
215 return this->onDecodeInto(pow2, bitmap);
216 }
218 /** Are we really wrapping a texture instead of a bitmap?
219 */
220 virtual GrTexture* getTexture() { return NULL; }
222 bool readPixels(SkBitmap* dst, const SkIRect* subset = NULL);
224 /**
225 * Makes a deep copy of this PixelRef, respecting the requested config.
226 * @param config Desired config.
227 * @param subset Subset of this PixelRef to copy. Must be fully contained within the bounds of
228 * of this PixelRef.
229 * @return A new SkPixelRef, or NULL if either there is an error (e.g. the destination could
230 * not be created with the given config), or this PixelRef does not support deep
231 * copies.
232 */
233 virtual SkPixelRef* deepCopy(SkBitmap::Config config, const SkIRect* subset = NULL) {
234 return NULL;
235 }
237 #ifdef SK_BUILD_FOR_ANDROID
238 /**
239 * Acquire a "global" ref on this object.
240 * The default implementation just calls ref(), but subclasses can override
241 * this method to implement additional behavior.
242 */
243 virtual void globalRef(void* data=NULL);
245 /**
246 * Release a "global" ref on this object.
247 * The default implementation just calls unref(), but subclasses can override
248 * this method to implement additional behavior.
249 */
250 virtual void globalUnref();
251 #endif
253 SK_DEFINE_FLATTENABLE_TYPE(SkPixelRef)
255 // Register a listener that may be called the next time our generation ID changes.
256 //
257 // We'll only call the listener if we're confident that we are the only SkPixelRef with this
258 // generation ID. If our generation ID changes and we decide not to call the listener, we'll
259 // never call it: you must add a new listener for each generation ID change. We also won't call
260 // the listener when we're certain no one knows what our generation ID is.
261 //
262 // This can be used to invalidate caches keyed by SkPixelRef generation ID.
263 struct GenIDChangeListener {
264 virtual ~GenIDChangeListener() {}
265 virtual void onChange() = 0;
266 };
268 // Takes ownership of listener.
269 void addGenIDChangeListener(GenIDChangeListener* listener);
271 protected:
272 /**
273 * On success, returns true and fills out the LockRec for the pixels. On
274 * failure returns false and ignores the LockRec parameter.
275 *
276 * The caller will have already acquired a mutex for thread safety, so this
277 * method need not do that.
278 */
279 virtual bool onNewLockPixels(LockRec*) = 0;
281 /**
282 * Balancing the previous successful call to onNewLockPixels. The locked
283 * pixel address will no longer be referenced, so the subclass is free to
284 * move or discard that memory.
285 *
286 * The caller will have already acquired a mutex for thread safety, so this
287 * method need not do that.
288 */
289 virtual void onUnlockPixels() = 0;
291 /** Default impl returns true */
292 virtual bool onLockPixelsAreWritable() const;
294 // returns false;
295 virtual bool onImplementsDecodeInto();
296 // returns false;
297 virtual bool onDecodeInto(int pow2, SkBitmap* bitmap);
299 /**
300 * For pixelrefs that don't have access to their raw pixels, they may be
301 * able to make a copy of them (e.g. if the pixels are on the GPU).
302 *
303 * The base class implementation returns false;
304 */
305 virtual bool onReadPixels(SkBitmap* dst, const SkIRect* subsetOrNull);
307 // default impl returns NULL.
308 virtual SkData* onRefEncodedData();
310 /**
311 * Returns the size (in bytes) of the internally allocated memory.
312 * This should be implemented in all serializable SkPixelRef derived classes.
313 * SkBitmap::fPixelRefOffset + SkBitmap::getSafeSize() should never overflow this value,
314 * otherwise the rendering code may attempt to read memory out of bounds.
315 *
316 * @return default impl returns 0.
317 */
318 virtual size_t getAllocatedSizeInBytes() const;
320 /** Return the mutex associated with this pixelref. This value is assigned
321 in the constructor, and cannot change during the lifetime of the object.
322 */
323 SkBaseMutex* mutex() const { return fMutex; }
325 // serialization
326 SkPixelRef(SkReadBuffer&, SkBaseMutex*);
327 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
329 // only call from constructor. Flags this to always be locked, removing
330 // the need to grab the mutex and call onLockPixels/onUnlockPixels.
331 // Performance tweak to avoid those calls (esp. in multi-thread use case).
332 void setPreLocked(void*, size_t rowBytes, SkColorTable*);
334 private:
335 SkBaseMutex* fMutex; // must remain in scope for the life of this object
337 // mostly const. fInfo.fAlpahType can be changed at runtime.
338 const SkImageInfo fInfo;
340 // LockRec is only valid if we're in a locked state (isLocked())
341 LockRec fRec;
342 int fLockCount;
344 mutable uint32_t fGenerationID;
345 mutable bool fUniqueGenerationID;
347 SkTDArray<GenIDChangeListener*> fGenIDChangeListeners; // pointers are owned
349 SkString fURI;
351 // can go from false to true, but never from true to false
352 bool fIsImmutable;
353 // only ever set in constructor, const after that
354 bool fPreLocked;
356 void needsNewGenID();
357 void callGenIDChangeListeners();
359 void setMutex(SkBaseMutex* mutex);
361 // When copying a bitmap to another with the same shape and config, we can safely
362 // clone the pixelref generation ID too, which makes them equivalent under caching.
363 friend class SkBitmap; // only for cloneGenID
364 void cloneGenID(const SkPixelRef&);
366 typedef SkFlattenable INHERITED;
367 };
369 class SkPixelRefFactory : public SkRefCnt {
370 public:
371 /**
372 * Allocate a new pixelref matching the specified ImageInfo, allocating
373 * the memory for the pixels. If the ImageInfo requires a ColorTable,
374 * the pixelref will ref() the colortable.
375 * On failure return NULL.
376 */
377 virtual SkPixelRef* create(const SkImageInfo&, SkColorTable*) = 0;
378 };
380 #endif