Chromium Code Reviews

Side by Side Diff: core/cross/bitmap.h

Issue 150058: expose bitmap in js. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: '' Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | Annotate | Revision Log
« no previous file with comments | « no previous file | core/cross/bitmap.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2009, Google Inc. 2 * Copyright 2009, Google Inc.
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 34 matching lines...)
45 #include "base/cross/bits.h" 45 #include "base/cross/bits.h"
46 #include "core/cross/types.h" 46 #include "core/cross/types.h"
47 #include "core/cross/texture.h" 47 #include "core/cross/texture.h"
48 48
49 class FilePath; 49 class FilePath;
50 50
51 namespace o3d { 51 namespace o3d {
52 52
53 class MemoryReadStream; 53 class MemoryReadStream;
54 class RawData; 54 class RawData;
55 55 class Pack;
56 class Bitmap { 56
57 // Bitmap provides an API for basic image operations on bitmap images,
58 // including scale and crop. The contents of bitmap can be created from
59 // a RawData object via LoadFromRawData(), and also can be transfered
60 // to mip of a Texure2D or a specific face of TextureCUBE via methods
61 // in Texture.
62
63 class Bitmap : public ParamObject {
57 public: 64 public:
65 typedef SmartPointer<Bitmap> Ref;
66
67 explicit Bitmap(ServiceLocator* service_locator);
68 virtual ~Bitmap() {}
58 69
59 // We will fail to load images that are bigger than 4kx4k to avoid security 70 // We will fail to load images that are bigger than 4kx4k to avoid security
60 // risks. GPUs don't usually support bigger sizes anyway. 71 // risks. GPUs don't usually support bigger sizes anyway.
61 // The biggest bitmap buffer size with these dimensions is: 72 // The biggest bitmap buffer size with these dimensions is:
62 // 4k x 4k x 4xsizeof(float) x6 x4/3 (x6 for cube maps, x4/3 for mipmaps) 73 // 4k x 4k x 4xsizeof(float) x6 x4/3 (x6 for cube maps, x4/3 for mipmaps)
63 // That makes 2GB, representable in an unsigned int, so we will avoid wraps. 74 // That makes 2GB, representable in an unsigned int, so we will avoid wraps.
64 static const unsigned int kMaxImageDimension = 4096; 75 static const unsigned int kMaxImageDimension = 4096;
65 enum ImageFileType { 76 enum ImageFileType {
66 UNKNOWN, 77 UNKNOWN,
67 TGA, 78 TGA,
68 JPEG, 79 JPEG,
69 PNG, 80 PNG,
70 DDS, 81 DDS,
71 }; 82 };
72 83
73 Bitmap()
74 : image_data_(NULL),
75 format_(Texture::UNKNOWN_FORMAT),
76 width_(0),
77 height_(0),
78 num_mipmaps_(0),
79 is_cubemap_(false) {}
80 ~Bitmap() {}
81
82 static bool CheckImageDimensions(unsigned int width, unsigned int height) { 84 static bool CheckImageDimensions(unsigned int width, unsigned int height) {
83 return width > 0 && height > 0 && 85 return width > 0 && height > 0 &&
84 width <= kMaxImageDimension && height < kMaxImageDimension; 86 width <= kMaxImageDimension && height < kMaxImageDimension;
85 } 87 }
86 88
87 // Creates a copy of a bitmap, copying the pixels as well. 89 // Creates a copy of a bitmap, copying the pixels as well.
88 // Parameters: 90 // Parameters:
89 // source: the source bitmap. 91 // source: the source bitmap.
90 void CopyDeepFrom(const Bitmap &source) { 92 void CopyDeepFrom(const Bitmap &source) {
91 Allocate(source.format_, source.width_, source.height_, 93 Allocate(source.format_, source.width_, source.height_,
(...skipping 135 matching lines...)
227 // with no mip-maps (only the base level). 229 // with no mip-maps (only the base level).
228 // Parameters: 230 // Parameters:
229 // filename: the name of the file to into. 231 // filename: the name of the file to into.
230 // Returns: 232 // Returns:
231 // true if successful. 233 // true if successful.
232 bool SaveToPNGFile(const char* filename); 234 bool SaveToPNGFile(const char* filename);
233 235
234 // Checks that the alpha channel for the entire bitmap is 1.0 236 // Checks that the alpha channel for the entire bitmap is 1.0
235 bool CheckAlphaIsOne() const; 237 bool CheckAlphaIsOne() const;
236 238
239 // Copy pixels from source bitmap. Scales if the width and height of source
240 // and dest do not match.
241 // Parameters:
242 // source_img: source bitmap which would be drawn.
243 // source_x: x-coordinate of the starting pixel in the source image.
244 // source_x: y-coordinate of the starting pixel in the source image.
245 // source_width: width of the source image to draw.
246 // source_height: Height of the source image to draw.
247 // dest_x: x-coordinate of the starting pixel in the dest image.
248 // dest_y: y-coordinate of the starting pixel in the dest image.
249 // dest_width: width of the dest image to draw.
250 // dest_height: height of the dest image to draw.
251 void DrawImage(Bitmap* source_img, int source_x, int source_y,
252 int source_width, int source_height,
253 int dest_x, int dest_y,
254 int dest_width, int dest_height);
255
256 // Crop part of an image from src, scale it to an arbitrary size
257 // and paste in dest image. Utility function for all DrawImage
258 // function in bitmap and textures. Scale operation is based on
259 // bilinear interpolation.
260 // Note: this doesn't work for DXTC, or floating-point images.
261 //
262 // Parameters:
263 // src: source image which would be copied from.
264 // src_x: x-coordinate of the starting pixel in the src image.
265 // src_y: y-coordinate of the starting pixel in the src image.
266 // src_width: width of the part in src image to be croped.
267 // src_height: height of the part in src image to be croped.
268 // src_img_width: width of the src image.
269 // src_img_height: height of the src image.
270 // dest: dest image which would be copied to.
271 // dest_x: x-coordinate of the starting pixel in the dest image.
272 // dest_y: y-coordinate of the starting pixel in the dest image.
273 // dest_width: width of the part in dest image to be pasted to.
274 // dest_height: height of the part in dest image to be pasted to.
275 // dest_img_width: width of the dest image.
276 // dest_img_height: height of the src image.
277 // component: size of each pixel in terms of array element.
278 // Returns:
279 // true if crop and scale succeeds.
280 static void BilinearInterpolateScale(const uint8* src,
281 int src_x, int src_y,
282 int src_width, int src_height,
283 int src_img_width, int src_img_height,
284 uint8* dest,
285 int dest_x, int dest_y,
286 int dest_width, int dest_height,
287 int dest_img_width, int dest_img_height,
288 int component);
289
237 // Detects the type of image file based on the filename. 290 // Detects the type of image file based on the filename.
238 static ImageFileType GetFileTypeFromFilename(const char *filename); 291 static ImageFileType GetFileTypeFromFilename(const char *filename);
239 // Detects the type of image file based on the mime-type. 292 // Detects the type of image file based on the mime-type.
240 static ImageFileType GetFileTypeFromMimeType(const char *mime_type); 293 static ImageFileType GetFileTypeFromMimeType(const char *mime_type);
241 294
242 // Adds filler alpha byte (0xff) after every pixel. Assumes buffer was 295 // Adds filler alpha byte (0xff) after every pixel. Assumes buffer was
243 // allocated with enough storage) 296 // allocated with enough storage)
244 // can convert RGB -> RGBA, BGR -> BGRA, etc. 297 // can convert RGB -> RGBA, BGR -> BGRA, etc.
245 static void XYZToXYZA(unsigned char *image_data, int pixel_count); 298 static void XYZToXYZA(unsigned char *image_data, int pixel_count);
246 299
(...skipping 66 matching lines...)
313 // dst: a buffer with enough space for the target version. Pixels are 366 // dst: a buffer with enough space for the target version. Pixels are
314 // written from the end to the beginning so dst can be the same buffer as 367 // written from the end to the beginning so dst can be the same buffer as
315 // src if the transformation is an upscaling. 368 // src if the transformation is an upscaling.
316 static bool Scale(unsigned int src_width, 369 static bool Scale(unsigned int src_width,
317 unsigned int src_height, 370 unsigned int src_height,
318 Texture::Format format, 371 Texture::Format format,
319 const unsigned char *src, 372 const unsigned char *src,
320 unsigned int dst_width, 373 unsigned int dst_width,
321 unsigned int dst_height, 374 unsigned int dst_height,
322 unsigned char *dst); 375 unsigned char *dst);
376
377 // adjust start points and boundaries when using DrawImage data
378 // in bitmap and textures.
379 // Parameters:
380 // src_x: x-coordinate of the starting pixel in the source image.
381 // src_y: y-coordinate of the starting pixel in the source image.
382 // src_width: width of the source image to draw.
383 // src_height: height of the source image to draw.
384 // src_bmp_width: original width of source bitmap.
385 // src_bmp_height: original height of source bitmap.
386 // dest_x: x-coordinate of the starting pixel in the dest image.
387 // dest_y: y-coordinate of the starting pixel in the dest image.
388 // dest_width: width of the dest image to draw.
389 // dest_height: height of the dest image to draw.
390 // dest_bmp_width: original width of dest bitmap.
391 // dest_bmp_height: original height of dest bitmap.
392 // Returns:
393 // false if src or dest rectangle is out of boundaries.
394 static bool AdjustDrawImageBoundary(int* src_x, int* src_y,
395 int* src_width, int* src_height,
396 int src_bmp_width, int src_bmp_height,
397 int* dest_x, int* dest_y,
398 int* dest_width, int* dest_height,
399 int dest_bmp_width, int dest_bmp_height);
400
323 private: 401 private:
402 friend class IClassManager;
403 static ObjectBase::Ref Create(ServiceLocator* service_locator);
404
324 // pointer to the raw bitmap data 405 // pointer to the raw bitmap data
325 scoped_array<uint8> image_data_; 406 scoped_array<uint8> image_data_;
326 // format of the texture this is meant to represent. 407 // format of the texture this is meant to represent.
327 Texture::Format format_; 408 Texture::Format format_;
328 // width of the bitmap in pixels. 409 // width of the bitmap in pixels.
329 unsigned int width_; 410 unsigned int width_;
330 // height of the bitmap in pixels. 411 // height of the bitmap in pixels.
331 unsigned int height_; 412 unsigned int height_;
332 // number of mipmap levels in this texture. 413 // number of mipmap levels in this texture.
333 unsigned int num_mipmaps_; 414 unsigned int num_mipmaps_;
334 // is this cube-map data 415 // is this cube-map data
335 bool is_cubemap_; 416 bool is_cubemap_;
336 417
418 // utility function used in AdjustDrawImageBoundary.
419 // It adjusts start point and related measures
420 // for a specific dimension.
421 // Parameter:
422 // src_a: the coordinate which is negative.
423 // dest_a: same coordinate in the other image.
424 // src_length: length measure of source image to draw.
425 // dest_length: length measure of dest image to draw.
426 // src_bmp_length: length measure of src image.
427 // Returns:
428 // true if adjust is successful.
429 static bool AdjustDrawImageBoundHelper(int* src_a, int* dest_a,
430 int* src_length, int* dest_length,
431 int src_bmp_length);
432
433 O3D_DECL_CLASS(Bitmap, ParamObject);
337 DISALLOW_COPY_AND_ASSIGN(Bitmap); 434 DISALLOW_COPY_AND_ASSIGN(Bitmap);
338 }; 435 };
339 436
340 } // namespace o3d 437 } // namespace o3d
341 438
342 #endif // O3D_CORE_CROSS_BITMAP_H_ 439 #endif // O3D_CORE_CROSS_BITMAP_H_
OLDNEW
« no previous file with comments | « no previous file | core/cross/bitmap.cc » ('j') | no next file with comments »

Powered by Google App Engine