aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_local/AlbumArtContainer.cpp
blob: 9b06b288c9d1f9453e619d4c485ec98998ac506d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "AlbumArtContainer.h"
#include "api__ml_local.h"
#include <tataki/bitmap/bitmap.h>
#include <tataki/canvas/canvas.h>
#include <assert.h>
#include "AlbumArtCache.h"
#include "../nde/nde.h"
#include <commctrl.h>

AlbumArtContainer::AlbumArtContainer() :filename(0)
{
	references = 1;
	cached = CACHE_UNKNOWN;
	cache = 0;
	updateMsg.hwnd = NULL;
}

void AlbumArtContainer::AddRef()
{
	references++;
}

void AlbumArtContainer::Release()
{
	if (--references == 0)
		delete this;
}

AlbumArtContainer::~AlbumArtContainer()
{
	ndestring_release(filename);
	if (cache) cache->Release();
}

void AlbumArtContainer::Reset()
{
	if (cache)
		cache->Release();
	cache = 0;
	cached = AlbumArtContainer::CACHE_UNKNOWN;
}

void AlbumArtContainer::SetCache(SkinBitmap *bitmap, CacheStatus status)
{
	if (cache)
		cache->Release();
	cache = bitmap;
	cached = status;

	// lets post the update message
	if(updateMsg.hwnd && (CACHE_CACHED == cached || CACHE_UNKNOWN == cached)) PostMessageW(updateMsg.hwnd,updateMsg.message,updateMsg.wParam,updateMsg.lParam);
}

int AlbumArtContainer::drawArt(DCCanvas *pCanvas, RECT *prcDst)
{
	switch (cached)
	{
		case CACHE_NOTFOUND:
			return DRAW_NOART;
		case CACHE_LOADING:
			return DRAW_LOADING;
		case CACHE_UNKNOWN:
			cached = CACHE_LOADING;
			CreateCache(this, prcDst->right - prcDst->left, prcDst->bottom - prcDst->top);
			return DRAW_LOADING;
		case CACHE_CACHED:
		{
			if (cache->getWidth() != (prcDst->right - prcDst->left) || cache->getHeight() != (prcDst->bottom - prcDst->top))
			{
				cached = CACHE_LOADING;
				CreateCache(this, prcDst->right - prcDst->left, prcDst->bottom - prcDst->top);
				return DRAW_LOADING;
			}
			if (pCanvas) cache->blitAlpha(pCanvas, prcDst->left, prcDst->top);
			return DRAW_SUCCESS;
		}
		default:
			return DRAW_NOART; // shouldn't reach this;
	}
}