Home
last modified time | relevance | path

Searched refs:SkSurface (Results 1 – 25 of 591) sorted by relevance

12345678910>>...24

/external/skqp/src/image/
DSkSurface.cpp128 static SkSurface_Base* asSB(SkSurface* surface) { in asSB()
134 SkSurface::SkSurface(int width, int height, const SkSurfaceProps* props) in SkSurface() function in SkSurface
142 SkSurface::SkSurface(const SkImageInfo& info, const SkSurfaceProps* props) in SkSurface() function in SkSurface
150 uint32_t SkSurface::generationID() { in generationID()
157 void SkSurface::notifyContentWillChange(ContentChangeMode mode) { in notifyContentWillChange()
161 SkCanvas* SkSurface::getCanvas() { in getCanvas()
165 sk_sp<SkImage> SkSurface::makeImageSnapshot() { in makeImageSnapshot()
169 sk_sp<SkImage> SkSurface::makeImageSnapshot(const SkIRect& srcBounds) { in makeImageSnapshot()
183 sk_sp<SkSurface> SkSurface::makeSurface(const SkImageInfo& info) { in makeSurface()
187 void SkSurface::draw(SkCanvas* canvas, SkScalar x, SkScalar y, in draw()
[all …]
DSkSurface_Gpu.cpp37 SkSurface::BackendHandleAccess access) { in prepare_rt_for_external_access()
39 case SkSurface::kFlushRead_BackendHandleAccess: in prepare_rt_for_external_access()
41 case SkSurface::kFlushWrite_BackendHandleAccess: in prepare_rt_for_external_access()
42 case SkSurface::kDiscardWrite_BackendHandleAccess: in prepare_rt_for_external_access()
44 surface->notifyContentWillChange(SkSurface::kRetain_ContentChangeMode); in prepare_rt_for_external_access()
77 sk_sp<SkSurface> SkSurface_Gpu::onNewSurface(const SkImageInfo& info) { in onNewSurface()
82 return SkSurface::MakeRenderTarget(fDevice->context(), kBudgeted, info, sampleCount, in onNewSurface()
146 fDevice->replaceRenderTargetContext(SkSurface::kRetain_ContentChangeMode == mode); in onCopyOnWrite()
285 sk_sp<SkSurface> SkSurface::MakeRenderTarget(GrContext* context, in MakeRenderTarget()
330 sk_sp<SkSurface> s = sk_make_sp<SkSurface_Gpu>(std::move(device)); in MakeRenderTarget()
[all …]
DSkSurface_Raster.cpp23 sk_sp<SkSurface> onNewSurface(const SkImageInfo&) override;
92 sk_sp<SkSurface> SkSurface_Raster::onNewSurface(const SkImageInfo& info) { in onNewSurface()
93 return SkSurface::MakeRaster(info, &this->props()); in onNewSurface()
165 sk_sp<SkSurface> SkSurface::MakeRasterDirectReleaseProc(const SkImageInfo& info, void* pixels, in MakeRasterDirectReleaseProc()
181 sk_sp<SkSurface> SkSurface::MakeRasterDirect(const SkImageInfo& info, void* pixels, size_t rowBytes, in MakeRasterDirect()
186 sk_sp<SkSurface> SkSurface::MakeRaster(const SkImageInfo& info, size_t rowBytes, in MakeRaster()
/external/skia/src/image/
DSkSurface.cpp79 SkSurface::RescaleGamma rescaleGamma, in onAsyncRescaleAndReadPixels()
81 SkSurface::ReadPixelsCallback callback, in onAsyncRescaleAndReadPixels()
82 SkSurface::ReadPixelsContext context) { in onAsyncRescaleAndReadPixels()
150 static SkSurface_Base* asSB(SkSurface* surface) { in asSB()
154 static const SkSurface_Base* asConstSB(const SkSurface* surface) { in asConstSB()
160 SkSurface::SkSurface(int width, int height, const SkSurfaceProps* props) in SkSurface() function in SkSurface
168 SkSurface::SkSurface(const SkImageInfo& info, const SkSurfaceProps* props) in SkSurface() function in SkSurface
176 SkImageInfo SkSurface::imageInfo() { in imageInfo()
181 uint32_t SkSurface::generationID() { in generationID()
188 void SkSurface::notifyContentWillChange(ContentChangeMode mode) { in notifyContentWillChange()
[all …]
DSkSurface_Gpu.cpp46 SkSurface::BackendHandleAccess access) { in prepare_rt_for_external_access()
56 case SkSurface::kFlushRead_BackendHandleAccess: in prepare_rt_for_external_access()
58 case SkSurface::kFlushWrite_BackendHandleAccess: in prepare_rt_for_external_access()
59 case SkSurface::kDiscardWrite_BackendHandleAccess: in prepare_rt_for_external_access()
61 surface->notifyContentWillChange(SkSurface::kRetain_ContentChangeMode); in prepare_rt_for_external_access()
96 sk_sp<SkSurface> SkSurface_Gpu::onNewSurface(const SkImageInfo& info) { in onNewSurface()
101 return SkSurface::MakeRenderTarget(fDevice->recordingContext(), kBudgeted, info, sampleCount, in onNewSurface()
403 sk_sp<SkSurface> SkSurface::MakeRenderTarget(GrRecordingContext* context, in MakeRenderTarget()
434 sk_sp<SkSurface> result = sk_make_sp<SkSurface_Gpu>(std::move(device)); in MakeRenderTarget()
471 sk_sp<SkSurface> SkSurface::MakeRenderTarget(GrRecordingContext* ctx, SkBudgeted budgeted, in MakeRenderTarget()
[all …]
DSkSurface_Raster.cpp23 sk_sp<SkSurface> onNewSurface(const SkImageInfo&) override;
81 sk_sp<SkSurface> SkSurface_Raster::onNewSurface(const SkImageInfo& info) { in onNewSurface()
82 return SkSurface::MakeRaster(info, &this->props()); in onNewSurface()
153 sk_sp<SkSurface> SkSurface::MakeRasterDirectReleaseProc(const SkImageInfo& info, void* pixels, in MakeRasterDirectReleaseProc()
169 sk_sp<SkSurface> SkSurface::MakeRasterDirect(const SkImageInfo& info, void* pixels, size_t rowBytes, in MakeRasterDirect()
174 sk_sp<SkSurface> SkSurface::MakeRaster(const SkImageInfo& info, size_t rowBytes, in MakeRaster()
190 sk_sp<SkSurface> SkSurface::MakeRasterN32Premul(int width, int height, in MakeRasterN32Premul()
/external/skqp/tests/
DSurfaceTest.cpp41 static sk_sp<SkSurface> create_surface(SkAlphaType at = kPremul_SkAlphaType, in create_surface()
47 return SkSurface::MakeRaster(info); in create_surface()
49 static sk_sp<SkSurface> create_direct_surface(SkAlphaType at = kPremul_SkAlphaType, in create_direct_surface()
57 return SkSurface::MakeRasterDirectReleaseProc(info, storage, rowBytes, in create_direct_surface()
61 static sk_sp<SkSurface> create_gpu_surface(GrContext* context, SkAlphaType at = kPremul_SkAlphaType, in create_gpu_surface()
67 return SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info); in create_gpu_surface()
69 static sk_sp<SkSurface> create_gpu_scratch_surface(GrContext* context, in create_gpu_scratch_surface()
76 return SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, info); in create_gpu_scratch_surface()
81 REPORTER_ASSERT(reporter, nullptr == SkSurface::MakeRaster(info)); in DEF_TEST()
82 REPORTER_ASSERT(reporter, nullptr == SkSurface::MakeRasterDirect(info, nullptr, 0)); in DEF_TEST()
[all …]
DImageNewShaderTest.cpp22 static void paint_source(SkSurface* sourceSurface) { in paint_source()
39 static void run_shader_test(skiatest::Reporter* reporter, SkSurface* sourceSurface, in run_shader_test()
40 SkSurface* destinationSurface, SkImageInfo& info) { in run_shader_test()
101 auto sourceSurface(SkSurface::MakeRaster(info)); in DEF_TEST()
102 auto destinationSurface(SkSurface::MakeRaster(info)); in DEF_TEST()
110 auto sourceSurface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info)); in gpu_to_gpu()
111 auto destinationSurface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info)); in gpu_to_gpu()
119 auto sourceSurface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info)); in gpu_to_raster()
120 auto destinationSurface(SkSurface::MakeRaster(info)); in gpu_to_raster()
128 auto sourceSurface(SkSurface::MakeRaster(info)); in raster_to_gpu()
[all …]
DDeferredDisplayListTest.cpp365 sk_sp<SkSurface> make(GrContext* context, GrBackendTexture* backend) const { in make()
388 return SkSurface::MakeFromBackendRenderTarget(context, backendRT, fOrigin, in make()
398 sk_sp<SkSurface> surface; in make()
401 surface = SkSurface::MakeFromBackendTextureAsRenderTarget( in make()
405 surface = SkSurface::MakeFromBackendTexture( in make()
512 sk_sp<SkSurface> s = params.make(context, &backend); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
531 sk_sp<SkSurface> s = params.make(context, &backend); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
584 sk_sp<SkSurface> s = params.make(context, &backend); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
622 sk_sp<SkSurface> s = params.make(context, &backend); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
637 sk_sp<SkSurface> rasterSurface = SkSurface::MakeRaster(ii); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
[all …]
Dskbug5221.cpp21 sk_sp<SkSurface> surface(SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(256, 256))); in DEF_TEST()
26 sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget( in DEF_GPUTEST_FOR_ALL_CONTEXTS()
/external/skqp/include/core/
DSkSurface.h45 class SK_API SkSurface : public SkRefCnt {
69 static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo& imageInfo, void* pixels,
97 static sk_sp<SkSurface> MakeRasterDirectReleaseProc(const SkImageInfo& imageInfo, void* pixels,
123 static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo, size_t rowBytes,
142 static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo,
165 static sk_sp<SkSurface> MakeRasterN32Premul(int width, int height,
198 static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context,
232 static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrContext* context,
269 static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context,
305 static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted,
[all …]
/external/skia/tests/
DSurfaceTest.cpp46 static sk_sp<SkSurface> create_surface(SkAlphaType at = kPremul_SkAlphaType, in create_surface()
52 return SkSurface::MakeRaster(info); in create_surface()
54 static sk_sp<SkSurface> create_direct_surface(SkAlphaType at = kPremul_SkAlphaType, in create_direct_surface()
62 return SkSurface::MakeRasterDirectReleaseProc(info, storage, rowBytes, in create_direct_surface()
66 static sk_sp<SkSurface> create_gpu_surface(GrRecordingContext* rContext, in create_gpu_surface()
73 return SkSurface::MakeRenderTarget(rContext, SkBudgeted::kNo, info); in create_gpu_surface()
75 static sk_sp<SkSurface> create_gpu_scratch_surface(GrRecordingContext* rContext, in create_gpu_scratch_surface()
82 return SkSurface::MakeRenderTarget(rContext, SkBudgeted::kYes, info); in create_gpu_scratch_surface()
87 REPORTER_ASSERT(reporter, nullptr == SkSurface::MakeRaster(info)); in DEF_TEST()
88 REPORTER_ASSERT(reporter, nullptr == SkSurface::MakeRasterDirect(info, nullptr, 0)); in DEF_TEST()
[all …]
DImageNewShaderTest.cpp22 static void paint_source(SkSurface* sourceSurface) { in paint_source()
39 static void run_shader_test(skiatest::Reporter* reporter, SkSurface* sourceSurface, in run_shader_test()
40 SkSurface* destinationSurface, SkImageInfo& info) { in run_shader_test()
100 auto sourceSurface(SkSurface::MakeRaster(info)); in DEF_TEST()
101 auto destinationSurface(SkSurface::MakeRaster(info)); in DEF_TEST()
109 auto sourceSurface(SkSurface::MakeRenderTarget(rContext, SkBudgeted::kNo, info)); in gpu_to_gpu()
110 auto destinationSurface(SkSurface::MakeRenderTarget(rContext, SkBudgeted::kNo, info)); in gpu_to_gpu()
118 auto sourceSurface(SkSurface::MakeRaster(info)); in raster_to_gpu()
119 auto destinationSurface(SkSurface::MakeRenderTarget(rContext, SkBudgeted::kNo, info)); in raster_to_gpu()
DGrSubmittedFlushTest.cpp33 sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(ctx, SkBudgeted::kNo, info); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
54 surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
69 surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
72 surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
82 surface->flush(SkSurface::BackendSurfaceAccess::kNoAccess, flushInfo); in DEF_GPUTEST_FOR_RENDERING_CONTEXTS()
DDeferredDisplayListTest.cpp227 sk_sp<SkSurface> make(GrDirectContext* dContext) const { in make()
246 sk_sp<SkSurface> result = SkSurface::MakeFromBackendRenderTarget(dContext, backendRT, in make()
260 sk_sp<SkSurface> surface; in make()
290 surface->getBackendTexture(SkSurface::kFlushRead_BackendHandleAccess); in make()
402 sk_sp<SkSurface> s = params.make(dContext); in DDLSurfaceCharacterizationTestImpl()
420 sk_sp<SkSurface> s = params.make(dContext); in DDLSurfaceCharacterizationTestImpl()
434 sk_sp<SkSurface> s = params.make(dContext); in DDLSurfaceCharacterizationTestImpl()
466 sk_sp<SkSurface> s = params.make(dContext); in DDLSurfaceCharacterizationTestImpl()
478 sk_sp<SkSurface> rasterSurface = SkSurface::MakeRaster(ii); in DDLSurfaceCharacterizationTestImpl()
487 sk_sp<SkSurface> s = params.make(dContext); in DDLSurfaceCharacterizationTestImpl()
[all …]
/external/skia/include/core/
DSkSurface.h46 class SK_API SkSurface : public SkRefCnt {
70 static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo& imageInfo, void* pixels,
74 static sk_sp<SkSurface> MakeRasterDirect(const SkPixmap& pm,
103 static sk_sp<SkSurface> MakeRasterDirectReleaseProc(const SkImageInfo& imageInfo, void* pixels,
128 static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo, size_t rowBytes,
147 static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo,
170 static sk_sp<SkSurface> MakeRasterN32Premul(int width, int height,
209 static sk_sp<SkSurface> MakeFromBackendTexture(GrRecordingContext* context,
243 static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrRecordingContext* context,
272 static sk_sp<SkSurface> MakeFromAHardwareBuffer(GrDirectContext* context,
[all …]
/external/skqp/docs/
DSkSurface_Reference.bmh4 #Class SkSurface
10 SkSurface is responsible for managing the pixels that a canvas draws into. The pixels can be
12 SkSurface takes care of allocating a SkCanvas that will draw into the surface. Call
16 SkSurface always has non-zero dimensions. If there is a request for a new surface, and either
21 #Method static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo& imageInfo, void* pixels,
34 sk_sp<SkSurface> surface(SkSurface::MakeRasterDirect(info, pixels, info.minRowBytes()));
61 #Method static sk_sp<SkSurface> MakeRasterDirectReleaseProc(const SkImageInfo& imageInfo, void* pix…
83 sk_sp<SkSurface> surface(SkSurface::MakeRasterDirectReleaseProc(info, pixels, rowBytes,
113 #Method static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo, size_t rowBytes,
123 sk_sp<SkSurface> surface(SkSurface::MakeRaster(info, rowBytes, nullptr));
[all …]
/external/skqp/site/user/api/
DSkSurface_Reference.md1 SkSurface Reference
5 <a name='SkSurface'></a>
10 class <a href='SkSurface_Reference#SkSurface'>SkSurface</a> : public <a href='undocumented#SkRefCnt…
12 …static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a…
15 …static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a…
19 …static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a…
21 …static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a…
23 …static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a…
25 …static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a…
31 …static <a href='undocumented#sk_sp'>sk_sp</a><<a href='SkSurface_Reference#SkSurface'>SkSurface</a…
[all …]
/external/skia/experimental/wasm-skp-debugger/
Ddebugger_bindings.cpp110 void drawTo(SkSurface* surface, int32_t index) { in drawTo()
131 void draw(SkSurface* surface) { in draw()
216 std::string jsonCommandList(sk_sp<SkSurface> surface) { in jsonCommandList()
334 int findCommandByPixel(SkSurface* surface, int x, int y, int commandIndex) { in findCommandByPixel()
360 SkColor evaluateCommandColor(SkSurface* surface, int command, int x, int y) { in evaluateCommandColor()
492 sk_sp<SkSurface> MakeOnScreenGLSurface(sk_sp<GrDirectContext> dContext, int width, int height) { in MakeOnScreenGLSurface()
511 sk_sp<SkSurface> surface(SkSurface::MakeFromBackendRenderTarget(dContext.get(), target, in MakeOnScreenGLSurface()
517 sk_sp<SkSurface> MakeRenderTarget(sk_sp<GrDirectContext> dContext, int width, int height) { in MakeRenderTarget()
520 sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget(dContext.get(), in MakeRenderTarget()
528 sk_sp<SkSurface> MakeRenderTarget(sk_sp<GrDirectContext> dContext, SimpleImageInfo sii) { in MakeRenderTarget()
[all …]
/external/skia/samplecode/
DSampleTextureUpload.cpp29 sk_sp<SkSurface> fBlueSurface;
30 sk_sp<SkSurface> fGraySurface;
38 fSurface = SkSurface::MakeRenderTarget(direct, SkBudgeted::kNo, imageInfo, 0, in RenderTargetTexture()
46 void uploadRasterSurface(sk_sp<SkSurface> rasterSurface) { in uploadRasterSurface()
53 sk_sp<SkSurface> fSurface;
83 sk_sp<SkSurface> getFilledRasterSurface(SkColor color, int size) { in getFilledRasterSurface()
84 sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(size, size)); in getFilledRasterSurface()
/external/skia/experimental/skottiekit/
Dskottiekit_bindings.cpp229 sk_sp<SkSurface> MakeOnScreenGLSurface(sk_sp<GrDirectContext> grContext, int width, int height) { in MakeOnScreenGLSurface()
251 sk_sp<SkSurface> surface(SkSurface::MakeFromBackendRenderTarget(grContext.get(), target, in MakeOnScreenGLSurface()
257 sk_sp<SkSurface> MakeRenderTarget(sk_sp<GrDirectContext> grContext, int width, int height) { in MakeRenderTarget()
260 sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget(grContext.get(), in MakeRenderTarget()
268 sk_sp<SkSurface> MakeRenderTarget(sk_sp<GrDirectContext> grContext, SimpleImageInfo sii) { in MakeRenderTarget()
269 sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget(grContext.get(), in MakeRenderTarget()
296 select_overload<sk_sp<SkSurface>(sk_sp<GrDirectContext>, int, int)>(&MakeRenderTarget)); in EMSCRIPTEN_BINDINGS()
298 … select_overload<sk_sp<SkSurface>(sk_sp<GrDirectContext>, SimpleImageInfo)>(&MakeRenderTarget)); in EMSCRIPTEN_BINDINGS()
331 size_t rowBytes)->sk_sp<SkSurface> { in EMSCRIPTEN_BINDINGS()
334 return SkSurface::MakeRasterDirect(imageInfo, pixels, rowBytes, nullptr); in EMSCRIPTEN_BINDINGS()
[all …]
/external/skia/tools/gpu/
DBackendSurfaceFactory.h17 class SkSurface; variable
22 sk_sp<SkSurface> MakeBackendTextureSurface(GrDirectContext*,
30 sk_sp<SkSurface> MakeBackendTextureSurface(GrDirectContext*,
41 sk_sp<SkSurface> MakeBackendRenderTargetSurface(GrDirectContext*,
48 sk_sp<SkSurface> MakeBackendRenderTargetSurface(GrDirectContext*,
/external/skqp/gm/
Dimagemasksubset.cpp22 sk_sp<SkImage> make_mask(const sk_sp<SkSurface>& surface) { in make_mask()
38 make_mask(SkSurface::MakeRasterDirect(surfaceInfo, pixels, rowBytes)); in onGetPixels()
50 return make_mask(SkSurface::MakeRaster(info)); in __anon9f67c3780202()
55 sk_sp<SkSurface> surface; in __anon9f67c3780302()
56 surface = SkSurface::MakeRenderTarget(c->getGrContext(), SkBudgeted::kNo, info); in __anon9f67c3780302()
57 return make_mask(surface ? surface : SkSurface::MakeRaster(info)); in __anon9f67c3780302()
/external/skia/gm/
Dimagemasksubset.cpp29 sk_sp<SkImage> make_mask(const sk_sp<SkSurface>& surface) { in make_mask()
45 make_mask(SkSurface::MakeRasterDirect(surfaceInfo, pixels, rowBytes)); in onGetPixels()
57 return make_mask(SkSurface::MakeRaster(info)); in __anon1ef734410202()
62 sk_sp<SkSurface> surface; in __anon1ef734410302()
63 surface = SkSurface::MakeRenderTarget(c->recordingContext(), SkBudgeted::kNo, info); in __anon1ef734410302()
64 return make_mask(surface ? surface : SkSurface::MakeRaster(info)); in __anon1ef734410302()
/external/skqp/bench/
DClipMaskBench.cpp50 sk_sp<SkSurface> surface = SkSurface::MakeRaster(SkImageInfo::MakeA8(size, size)); in __anon1909cb930102()
56 sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(size, size); in __anon1909cb930202()
74 sk_sp<SkSurface> fSurf;
81 fSurf = SkSurface::MakeRasterN32Premul(W, H); in RasterTileBench()

12345678910>>...24