OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrSurface.h" | 8 #include "GrSurface.h" |
9 #include "GrSurfacePriv.h" | 9 #include "GrSurfacePriv.h" |
10 | 10 |
11 #include "SkBitmap.h" | 11 #include "SkBitmap.h" |
12 #include "SkGr.h" | 12 #include "SkGr.h" |
13 #include "SkImageEncoder.h" | 13 #include "SkImageEncoder.h" |
14 #include <stdio.h> | 14 #include <stdio.h> |
15 | 15 |
| 16 template<typename T> static bool adjust_params(int surfaceWidth, |
| 17 int surfaceHeight, |
| 18 size_t bpp, |
| 19 int* left, int* top, int* width,
int* height, |
| 20 T** data, |
| 21 size_t* rowBytes) { |
| 22 if (!*rowBytes) { |
| 23 *rowBytes = *width * bpp; |
| 24 } |
| 25 |
| 26 SkIRect subRect = SkIRect::MakeXYWH(*left, *top, *width, *height); |
| 27 SkIRect bounds = SkIRect::MakeWH(surfaceWidth, surfaceHeight); |
| 28 |
| 29 if (!subRect.intersect(bounds)) { |
| 30 return false; |
| 31 } |
| 32 *data = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(*data) + |
| 33 (subRect.fTop - *top) * *rowBytes + (subRect.fLeft - *left) * bpp); |
| 34 |
| 35 *left = subRect.fLeft; |
| 36 *top = subRect.fTop; |
| 37 *width = subRect.width(); |
| 38 *height = subRect.height(); |
| 39 return true; |
| 40 } |
| 41 |
| 42 bool GrSurfacePriv::AdjustReadPixelParams(int surfaceWidth, |
| 43 int surfaceHeight, |
| 44 size_t bpp, |
| 45 int* left, int* top, int* width, int*
height, |
| 46 void** data, |
| 47 size_t* rowBytes) { |
| 48 return adjust_params<void>(surfaceWidth, surfaceHeight, bpp, left, top, widt
h, height, data, |
| 49 rowBytes); |
| 50 } |
| 51 |
| 52 bool GrSurfacePriv::AdjustWritePixelParams(int surfaceWidth, |
| 53 int surfaceHeight, |
| 54 size_t bpp, |
| 55 int* left, int* top, int* width, int*
height, |
| 56 const void** data, |
| 57 size_t* rowBytes) { |
| 58 return adjust_params<const void>(surfaceWidth, surfaceHeight, bpp, left, top
, width, height, |
| 59 data, rowBytes); |
| 60 } |
| 61 |
| 62 |
| 63 ////////////////////////////////////////////////////////////////////////////// |
| 64 |
16 bool GrSurface::writePixels(int left, int top, int width, int height, | 65 bool GrSurface::writePixels(int left, int top, int width, int height, |
17 GrPixelConfig config, const void* buffer, size_t row
Bytes, | 66 GrPixelConfig config, const void* buffer, size_t row
Bytes, |
18 uint32_t pixelOpsFlags) { | 67 uint32_t pixelOpsFlags) { |
19 // go through context so that all necessary flushing occurs | 68 // go through context so that all necessary flushing occurs |
20 GrContext* context = this->getContext(); | 69 GrContext* context = this->getContext(); |
21 if (NULL == context) { | 70 if (NULL == context) { |
22 return false; | 71 return false; |
23 } | 72 } |
24 return context->writeSurfacePixels(this, left, top, width, height, config, b
uffer, rowBytes, | 73 return context->writeSurfacePixels(this, left, top, width, height, config, b
uffer, rowBytes, |
25 pixelOpsFlags); | 74 pixelOpsFlags); |
26 } | 75 } |
27 | 76 |
28 bool GrSurface::readPixels(int left, int top, int width, int height, | 77 bool GrSurface::readPixels(int left, int top, int width, int height, |
29 GrPixelConfig config, void* buffer, size_t rowBytes, | 78 GrPixelConfig config, void* buffer, size_t rowBytes, |
30 uint32_t pixelOpsFlags) { | 79 uint32_t pixelOpsFlags) { |
31 // go through context so that all necessary flushing occurs | 80 // go through context so that all necessary flushing occurs |
32 GrContext* context = this->getContext(); | 81 GrContext* context = this->getContext(); |
33 if (NULL == context) { | 82 if (NULL == context) { |
34 return false; | 83 return false; |
35 } | 84 } |
36 GrRenderTarget* target = this->asRenderTarget(); | 85 return context->readSurfacePixels(this, left, top, width, height, config, bu
ffer, |
37 if (target) { | 86 rowBytes, pixelOpsFlags); |
38 return context->readRenderTargetPixels(target, left, top, width, height,
config, buffer, | |
39 rowBytes, pixelOpsFlags); | |
40 } | |
41 return false; | |
42 } | 87 } |
43 | 88 |
44 SkImageInfo GrSurface::info(SkAlphaType alphaType) const { | 89 SkImageInfo GrSurface::info(SkAlphaType alphaType) const { |
45 SkColorType colorType; | 90 SkColorType colorType; |
46 SkColorProfileType profileType; | 91 SkColorProfileType profileType; |
47 if (!GrPixelConfig2ColorAndProfileType(this->config(), &colorType, &profileT
ype)) { | 92 if (!GrPixelConfig2ColorAndProfileType(this->config(), &colorType, &profileT
ype)) { |
48 sk_throw(); | 93 sk_throw(); |
49 } | 94 } |
50 return SkImageInfo::Make(this->width(), this->height(), colorType, alphaType
, | 95 return SkImageInfo::Make(this->width(), this->height(), colorType, alphaType
, |
51 profileType); | 96 profileType); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 | 173 |
129 void GrSurface::onRelease() { | 174 void GrSurface::onRelease() { |
130 this->invokeReleaseProc(); | 175 this->invokeReleaseProc(); |
131 this->INHERITED::onRelease(); | 176 this->INHERITED::onRelease(); |
132 } | 177 } |
133 | 178 |
134 void GrSurface::onAbandon() { | 179 void GrSurface::onAbandon() { |
135 this->invokeReleaseProc(); | 180 this->invokeReleaseProc(); |
136 this->INHERITED::onAbandon(); | 181 this->INHERITED::onAbandon(); |
137 } | 182 } |
OLD | NEW |